求尽量多的字符串 每种大写字母出现偶数次
每个字符串可以看成一个长度为26 出现奇数次对应位置为1 偶数为0
就是求一些字符串 他们的异或为0
n最大为24
2^24超时
可以枚举前一半n/2所以的子集 存在map里
然后枚举后一半看是否有和它相同的 相同的异或就为0
枚举一半时间可以接受
#include <cstdio> #include <cstring> #include <map> using namespace std; const int maxn = 30; map <int, int> table; int n, a[maxn]; int bitcount(int x) { return x == 0 ? 0 : bitcount(x/2) + (x&1); } int main() { char s[1000]; while(scanf("%d", &n) == 1 && n) { for(int i = 0; i < n; i++) { a[i] = 0; scanf("%s", s); for(int j = 0; s[j]; j++) a[i] ^= (1<<(s[j]-‘A‘)); } int n1 = n/2; int n2 = n-n1; table.clear(); for(int i = 0; i < (1<<n1); i++)//前半 枚举了所有n1个元素的子集 { 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))//bitcount求i的2进制中1的个数 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[n1+j]; } if(table.count(x) && bitcount(ans) < bitcount(table[x]) + bitcount(i)) ans = (i<<n1)^table[x]; } printf("%d\n", bitcount(ans)); for(int i = 0; i < n; i++) { if(ans & (1<<i)) printf("%d ", i+1); } printf("\n"); } return 0; }