Skip to content

Instantly share code, notes, and snippets.

@hakatashi
Created December 15, 2013 07:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hakatashi/7970054 to your computer and use it in GitHub Desktop.
Save hakatashi/7970054 to your computer and use it in GitHub Desktop.
JOI2013年度予選問題4。15分で解いたので汚いのは許して
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
bool atnd(int a, char b) {
if (b == 'J') {
if (a >> 0 & 1 == 1) return true;
else return false;
} else if (b == 'O') {
if (a >> 1 & 1 == 1) return true;
else return false;
} else if (b == 'I') {
if (a >> 2 & 1 == 1) return true;
else return false;
}
}
bool serial(int a, int b) {
if (atnd(a,'J') && atnd(b,'J')) return true;
if (atnd(a,'O') && atnd(b,'O')) return true;
if (atnd(a,'I') && atnd(b,'I')) return true;
return false;
}
int main() {
int N;
char JOI[1001];
int dp[1001][8];
std::cin >> N;
std::cin >> JOI;
for (int i = 0; i < 8; i++) {
if (atnd(i, JOI[0]) && atnd(i, 'J')) dp[0][i] = 1;
else dp[0][i] = 0;
}
for (int i = 1; i < N; i++) {
for (int j = 0; j < 8; j++) {
dp[i][j] = 0;
if (atnd(j, JOI[i])) {
for (int k = 0; k < 8; k++) {
if (serial(j, k)) dp[i][j] = (dp[i][j] + dp[i-1][k]) % 10007;
}
}
}
}
int ans = 0;
for (int j = 0; j < 8; j++) {
ans = (ans + dp[N-1][j]) % 10007;
}
std::cout << ans << std::endl;
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment