题目链接: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;
}