【UVALive】2965 Jurassic Remains(中途相遇法)
题目
传送门:QWQ
分析
太喵了~~~~~
还有中途相遇法这种东西的。
嗯 以后可以优化一些暴力
详情左转蓝书P58
(但可能我OI生涯中都遇不到正解是这个的题把。。。。。。
代码
#include <bits/stdc++.h> using namespace std; const int maxn=25; map<int,int> table; int bitcount(int x){return x==0?0:bitcount(x>>1)+(x&1);} int main(){ int n,A[maxn]; char s[100]; while(scanf("%d",&n)==1 && n){ for(int i=0;i<n;i++){ scanf("%s",s); A[i]=0; for(int j=0;s[j]!='\0';j++) A[i]|=(1<<(s[j]-'A')); } table.clear(); int n1=n>>1, 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(ans)<bitcount(i)+bitcount(table[x])) 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); puts(""); } return 0; }