#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn = 25;
char str[111111];
int a[maxn*3],b[maxn*3],n;
map<int,int> vis;
struct RES{
int num;
int s1,s2;
RES(int x,int y,int z):num(x),s1(y),s2(z){}
};
int bitcount(int x) {return x==0 ? 0:bitcount(x>>1)+(x&1);}
int main()
{
while(scanf("%d",&n)==1){
for(int i=0;i<n;i++){
scanf("%s",str);
memset(a,0,sizeof(a));
int len=strlen(str);
for(int j=0;j<len;j++){
a[str[j]-'A']=(a[str[j]-'A']+1)%2;
}
b[i]=0;
for(int j=0;j<26;j++){ b[i]+=(a[j]<<j); }
}
vis.clear();
int mid = n>>1;
for(int i=0;i<(1<<mid);i++){
int num=0,val=0;
for(int j=0;j<mid;j++) if((i>>j)&1){
num++; val^=b[j];
}
if(!vis.count(val) || bitcount(vis[val]) < num)
vis[val] = i;
}
RES res(0,0,0);
int len=n-mid;
for(int i=0;i<(1<<len);i++){
int num=0,val=0;
for(int j=0;j<len;j++) if((i>>j)&1){
num++; val^=b[j+mid];
}
if(vis.count(val)){
if(res.num < num + bitcount(vis[val])) {
res=RES(num + bitcount(vis[val]),vis[val],i);
}
}
}
vector<int> ans;
printf("%d\n",res.num);
for(int i=0;i<mid;i++) if((res.s1>>i)&1) {ans.push_back(i+1); }
for(int i=0;i<len;i++) if((res.s2>>i)&1) ans.push_back(i+1+mid);
sort(ans.begin(),ans.end());
for(int i=0;i<ans.size();i++) {
if(i) printf(" ");
printf("%d",ans[i]);
}
printf("\n");
}
return 0;
}
UVA - 1326 (中途相遇法 + 统计奇偶)
最新推荐文章于 2024-11-12 08:13:14 发布