码迷,mamicode.com
首页 > 其他好文 > 详细

UVA - 11127 Triple-Free Binary Strings dfs

时间:2015-05-03 20:42:10      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:

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

UVA - 11127 Triple-Free Binary Strings dfs

标签:

原文地址:http://blog.csdn.net/l123012013048/article/details/45460863

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!