首页 > 代码库 > UVA11127- Triple-Free Binary Strings(DFS+位运算)
UVA11127- Triple-Free Binary Strings(DFS+位运算)
题目链接
题意:给出长度为n的字符串,字符串由‘1’,‘0’,‘*’组成,其中‘*’可以任意替换为‘1’,‘0’,求不存在连续3个相同子串的字符串的最多个数。
思路:我们可以利用二进制的形式来表示字符串,进行DFS。利用位运算的左移来表示在‘*’位置上放置‘1’,注意在递归的过程中注意判断之否存在3个连续相同的子串。
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int MAXN = 32; char str[MAXN]; int n, ans; bool judge(int s, int d) { int k = (1 << d) - 1; int a = s & k; s = s >> d; int b = s & k; s = s >> d; int c = s & k; if (a == b && b == c) return true; else return false; }//利用位运算,右移d位,判断是否存在3个子串相同 void dfs(int s, int cnt) { int num = cnt / 3; int t = n - cnt - 1; for (int i = 1; i <= num; i++) { if (judge(s >> (t + 1), i)) return; } if (cnt == n) { ans++; return; } else if (str[cnt] == '0') { dfs(s, cnt + 1); } else if (str[cnt] == '1') { dfs(s + (1 << t), cnt + 1); } else if (str[cnt] == '*') { dfs(s, cnt + 1); dfs(s + (1 << t), cnt + 1); } return; } int main() { int cas = 1; while (scanf("%d", &n) && n) { scanf("%s", str); ans = 0; dfs(0, 0); printf("Case %d: %d\n", cas++, ans); } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。