标签:

把串分成前后两半,前面的做暴力枚举,并把结果丢到集合里去,
后面的也暴力枚举,并且每次的结果去集合里看有无出现过相同的.
如果有那么异或后为0,就是符合题目要求的,选出包含字符串个数最多的!
这样一优化,前后两个2^12+2^12,瞬间时间复杂度开方了!
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <string>
#include <stack>
#include <cmath>
#include <queue>
#include <set>
#include <map>
typedef long long ll;
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=1e6+10;
int n;
int a[25];
map<int,int>table;
int bitcount(int x){
return x==0 ? 0 : (bitcount(x/2)+(x&1)) ;
}
int main()
{
while(scanf("%d",&n)!=EOF && n){
char s[1005];
for(int i=0;i<n;++i){
scanf("%s",&s);
//printf("%s\n", s);
a[i]=0;
for(int j=0 ; s[j]!=‘\0‘ ;++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 ){
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[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;
}
la 2965 Jurassic Remains (中途相遇法)
标签:
原文地址:http://www.cnblogs.com/bruce27/p/4787017.html