2 3 2 3 4 5 1 5 4 1 4 6 5 6 3
Case #1: 4 3 Case #2: 4
#include<cstdio> #include<cstdlib> #include<iostream> #define LL long long using namespace std; LL power[32]; typedef struct TrieNode { struct TrieNode *next[2]; }TrieNode; void Init(TrieNode **root) { *root=NULL; } TrieNode *CreateNode() { TrieNode *p; p=(TrieNode *)malloc(sizeof(TrieNode)); if(!p) { printf("No enough memory!\n"); exit(-1); } p->next[0]=NULL; p->next[1]=NULL; return p; } void InsertNode(TrieNode **root,LL data) { int i,k; TrieNode *p=*root; if(p==NULL) { p=*root=CreateNode(); } for(i=31;i>=0;i--) { if(data&power[i]) k=1; else k=0; if(p->next[k]==NULL) p->next[k]=CreateNode(); p=p->next[k]; } } LL Search(TrieNode *root,LL data) { LL ans=0; TrieNode *p=root; for(int i=31;i>=0;i--) { if(data&power[i])//the No.i bit is 1 { if(p->next[0])//to get the max xor value the same bit should p=p->next[0]; // be 0 if it exists else// if not exist ,then have to choose 1 { ans|=power[i]; p=p->next[1]; } } else//the No.i bit is 0,so we should choose 1 if it exits { if(p->next[1]) { ans|=power[i]; p=p->next[1]; } else p=p->next[0]; } } return ans; } int main(int argc,char *argv[]) { LL t,n,m; scanf("%I64d",&t); for(LL i=1;i<=t;i++) { TrieNode *root; power[0]=1; for(int j=1;j<=31;j++) power[j]=power[j-1]<<1; Init(&root); printf("Case #%I64d:\n",i); scanf("%I64d%I64d",&n,&m); while(n--) { LL data; scanf("%I64d",&data); InsertNode(&root,data); } while(m--) { LL s; scanf("%I64d",&s); printf("%I64d\n",Search(root,s)); } } return 0; }
2014百度之星资格赛——XOR SUM,布布扣,bubuko.com
原文:http://blog.csdn.net/cstopcoder/article/details/26630157