UVA 1326 - Jurassic Remains(位运算)
来源:互联网 发布:西安财经行知学院贴吧 编辑:程序博客网 时间:2024/05/22 02:02
这个题 充分利用了 二进制 , 包括二进制枚举子集。 位运算。
异或 ^ 可以用来 判断两个二进制相同位置上是否相同。
这个题充分利用了二进制 来保存 一个状态。 对于每一个字符串。 都可以用一个 26位的二进制 来表现这个数是否存在。 如果出现了偶数次 那就相当于没出现过。
如 ABD 就可以表示为 1 1 0 1 0 0 0 0 0 0 ......
然后分成两部分求。 把前半部分 所能构成的 所有的可能性 x 都保存到 map标记里面。 然后 在求 后部分的时候 如果 同样出现了 x 那就代表 这两部分可以 作为一个解的可能
我们都知道 如果 两个二进制 如果对应位置相同 那么一定是 偶数个字母的。
#include <cstdio>#include <algorithm>#include <iostream>#include <cstring>#include <cmath>#include <cstdlib>#include <string>#include <map>#include <vector>#include <set>#include <queue>#include <stack>#include <cctype>using namespace std;typedef long long ll;typedef unsigned long long ull;#define maxn 1000+10#define INF 1<<30int bitcount(int x){ return x == 0 ? x : bitcount(x>>1) + (x&1);}int main (){ int n; while(scanf("%d",&n) != EOF){ map <int, int> table; char s[maxn]; int a[maxn] = {0}; for(int i = 0; i < n; i++){ scanf("%s",s); int len = strlen(s); for(int j = 0; j < len; j++){ a[i] ^= (1<<(s[j]-'A')); } } int n1 = n/2, n2 = n-n1; for(int i = 0; i < (1<<n1); i++){ int x = 0; for(int j = 0; j < n1; j++){ if(i & (1 << j)) x ^= a[j]; } if(!table.count(x) || bitcount(table[x]) < bitcount(i)){ table[x] = i; // 保存的是一个排列 } } int ans = 0; for(int i = 0; i < (1<<n2); i++){ int x = 0; for(int j = 0; j < n2; j++){ if(i & (1 << j)) x ^= a[j+n1]; } if(table.count(x) && bitcount(i)+bitcount(table[x])> bitcount(ans)) ans = (i << n1)^table[x]; } printf("%d\n",bitcount(ans)); int flag = 0; for(int i = 0; i < n; i++){ if((ans & (1 << i)) && !flag){ printf("%d",i+1); flag = 1; } else if((ans & (1 << i))) printf(" %d",i+1); } printf("\n"); } return 0;}
0 0
- UVA 1326 - Jurassic Remains(位运算)
- uva 1326 Jurassic Remains(中途相遇法+位运算)
- UVA 1326 - Jurassic Remains(技巧枚举+位运算)
- uva 1326 - Jurassic Remains(暴力+位运算+中间相遇法)
- uva 1326 - Jurassic Remains
- UVA 1326 Jurassic Remains
- UVA 1326 Jurassic Remains
- UVa 1326 - Jurassic Remains
- UVA - 1326 Jurassic Remains
- Jurassic Remains(LA 2965)位运算+枚举
- uva 1326 Jurassic Remains(中途相遇法)
- Uva 1326 - Jurassic Remains 中途相遇法
- UVA 1326 Jurassic Remains 中途相遇法
- UVA 1326 Jurssic Remains(位运算)
- UVa 1326 Jurassic Remains 解题报告(Meet-in-the-Middle)
- POJ 1903 & ZOJ 2469 & UVA 1326 Jurassic Remains (部分枚举)
- Jurassic Remains
- Jurassic Remains
- Linux sed命令
- 倒序输出数组元素、求数组中最大值
- SSO cas 原理总结
- Unity3d快捷键
- 对触发器的思考
- UVA 1326 - Jurassic Remains(位运算)
- Lua中的table函数库
- 那些曾经的回忆
- windowsServer2008_64位安装oracle10G全过程
- ACM Stall Reservations(挑战程序设计竞赛)
- C语言之数组、内存地址
- 基于hadoop搜索引擎实践——网页爬取(二)
- lua/require函数
- 阿里2015校招面试回忆录(成功拿到offer)