题目大意:有一个字符串,这个字符串由0,1和*组成,*可以变成0也可以变成1,要求变化后的字符串的字符只能是0或者1。
现在给出这个字符串,要求变化后的字符串中不能出现三个连续相同的子串,问最多可以变化成多少个符合规则的串

解题思路:因为只有0和1,且只有30位,所以可以用一个正数来表示状态。dfs暴力枚举,边枚举边判断,看当前的是否符合

#include<cstdio>
#include<cstring>
using namespace std;
#define maxn 35
int n;
char str[maxn];

bool judge(int s, int l) {
    int mod = (1 << l) - 1;
    int first = (s & mod);
    s = (s & (~mod)) >> l;
    int second = (s & mod);
    s = (s & (~mod)) >> l;
    if(first == second && second == s)
        return true;
    return false;
}

int dfs(int s, int cur) {
    int s0 = s;
    for(int i = 0; i <= cur - 3; i++) {
        if( ((cur - i) % 3 == 0) && judge(s0, (cur - i) / 3))
            return 0;
        s0 = (s0 & (~1)) >> 1;
    }

    if(cur == n)
        return 1;
    if(str[cur] == '0')
        return dfs(s, cur + 1);
    if(str[cur] == '1')
        return dfs(s ^ (1 << cur), cur + 1);
    return dfs(s, cur + 1) + dfs(s ^ (1 << cur), cur + 1);
}

int main() {
    int cas = 1;
    while(scanf("%d", &n) != EOF && n) {
        scanf("%s", str);
        printf("Case %d: %d\n", cas++, dfs(0,0));
    }
    return 0;
}