bool RegexEngine::setRegex(const std::string& regex) { regex_.clear(); regex_.textFormat_ = regex; bool isValid = buildAutomata(); return isValid; }
int main(void){ int i, j, k, _case = 1; char c; for (i = 2; i < MAXN; i++) len[i] = min(len[i-1] + len[i-2], MAXSTR); for (i = 4, j = 3; i < MAXN && j < MAXSTR; i++) for (k = 0; k < len[i-2]; k++) if (j < MAXSTR) prefix[j++] = prefix[k]; for (j = MAXSTR - len[24], k = 0; j < MAXSTR; j++, k++) suffix[0][j] = prefix[k]; for (j = 0, k = len[23] - (MAXSTR - len[24]); k < len[23]; k++) suffix[0][j] = prefix[k]; for (j = MAXSTR - len[23], k = 0; j < MAXSTR; j++, k++) suffix[1][j] = prefix[k]; for (j = MAXSTR - len[23] - len[22], k = 0; k < len[22]; j++, k++) suffix[1][j] = prefix[k]; for (j = MAXSTR - len[23] - len[22] - len[21], k = 0; k < len[21]; j++, k++) suffix[1][j] = prefix[k]; for (j = 0, k = len[20] - (MAXSTR - len[23] - len[22] - len[21]); k < len[20]; k++) suffix[0][j] = prefix[k]; while (scanf("%d\n", &N) != EOF){ for (pLen = 0, c = getchar(); c == '0' || c == '1'; pLen++, c = getchar()) pattern[pLen+1] = c == '1'; pattern[pLen+1] = 2; buildAutomata(); dp[0] = dp[1] = dp[2] = 0; if (pLen == 1) dp[2] = dp[pattern[1]] = 1; else if (pLen == 2 && pattern[1] == 1 && pattern[2] == 0) dp[2] = 1; for (i = 3; i <= N; i++) dp[i] = dp[i-1] + dp[i-2] + overlapping(i); printf("Case %d: %lld\n", _case++, dp[N]); } return 0; }