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
原创粉丝点击