题目链接:uva 1326 - Jurassic Remains
题目大意:给出n个字符串,每个字符串由大写字母组成(每个字母最多出现一次),问说找出尽量多的字符串,使得这些字符串中任意字母出现的次数均为偶数。
解题思路:
方法1:暴力枚举,o(2^24)的复杂度18s还是hold的住得。
#include <stdio.h> #include <string.h> const int N = 105; int n, k[N], c[N], v[N], ans; int handle(char* s) { int len = strlen(s), k = 0; for (int i = 0; i < len; i++) k = k ^ (1<<(s[i]-'A')); return k; } void init () { ans = 0; memset(v, 0, sizeof(v)); memset(c, 0, sizeof(c)); char word[N]; for (int i = 0; i < n; i++) { scanf("%s", word); k[i] = handle(word); } } void dfs (int d, int s, int cnt) { if (d >= n) { if (s == 0 && cnt > ans) { memcpy(v, c, sizeof(c)); ans = cnt; } return; } c[d] = 0; dfs (d + 1, s, cnt); c[d] = 1; dfs (d + 1, s ^ k[d], cnt + 1); c[d] = 0; } void put () { printf("%d\n", ans); int x = 0; for (int i = 0; i < 24; i++) if (v[i]) { if (x++) printf(" "); printf("%d", i + 1); } printf("\n"); } int main () { while (scanf("%d", &n) == 1) { init(); dfs(0, 0, 0); put(); } return 0; }
#include <stdio.h> #include <string.h> #include <map> using namespace std; const int N = 105; int n, k[N], ans; map<int, int> g; int bitCount(int x) { return x == 0 ? 0 : bitCount(x >> 1) + (x&1); } int handle(char* s) { int len = strlen(s), k = 0; for (int i = 0; i < len; i++) k ^= (1<<(s[i]-'A')); return k; } void init () { ans = 0; g.clear(); char word[N]; for (int i = 0; i < n; i++) { scanf("%s", word); k[i] = handle(word); } } void solve () { int mid = n >> 1; for (int i = 0; i < (1<<mid); i++) { int s = 0; for (int j = 0; j < mid; j++) if (i & (1<<j)) { s ^= k[j]; } if (!g[s] || bitCount(g[s]) < bitCount(i)) g[s] = i; } int t = n - mid; for (int i = 0; i < (1<<t); i++) { int s = 0; for (int j = 0; j < t; j++) if (i & (1<<j)) { s ^= k[mid + j]; } if (g[s] && bitCount(g[s]) + bitCount(i) > bitCount(ans)) { ans = (i<<mid) ^ g[s]; } } } void put () { int x = 0; printf("%d\n", bitCount(ans)); for (int i = 0; i < n; i++) if (ans & (1<<i)) { if (x++) printf(" "); printf("%d", i + 1); } printf("\n"); } int main () { while (scanf("%d", &n) == 1) { init(); solve(); put(); } return 0; }