题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=4825
#include <stdio.h>
#include <string.h>
#define MAX(a,b) ((a)>(b)?(a):(b))
#define NODE 32000100
#define N 100010
__int64 n,m;
__int64 node;
__int64 next[NODE][2];
__int64 end[NODE];
void add(__int64 cur,__int64 k)
{
memset(next[node],0,sizeof(next[node]));
end[node]=0;
next[cur][k]=node++;
}
__int64 cal(__int64 x)
{
__int64 i,k,cur=0;
for(i=31;i>=0;i--)
{
k=((1<<i)&x)?0:1;
if(next[cur][k]) cur=next[cur][k];
else cur=next[cur][1-k];
}
return (end[cur]);
}
int main()
{
__int64 q;
__int64 t,num;
__int64 i,j,k,x,cur;
__int64 ans;
scanf("%I64d",&t);
for(q=1;q<=t;++q){
scanf("%I64d%I64d",&n,&m);
node=1;
memset(next[0],0,sizeof(next[0]));
for(i=0;i<n;i++)
{
scanf("%I64d",&x);
cur=0;
for(j=31;j>=0;j--)
{
k=((1<<j)&x)?1:0;
if(next[cur][k]==0) add(cur,k);
cur=next[cur][k];
}
end[cur]=x;
}
printf("Case #%I64d:\n",q);
for(i=0;i<m;++i){
scanf("%I64d",&num);
printf("%I64d\n",cal(num));
}
}
return 0;
}