题目大意:有一个字符串,这个字符串由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;
}