现在的位置: 首页 > 综合 > 正文

UVA – 1326 (中途相遇法 + 统计奇偶)

2019年04月04日 ⁄ 综合 ⁄ 共 1197字 ⁄ 字号 评论关闭
#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;
}


抱歉!评论已关闭.