这个题是找亦或最大的,那么越高位亦或得1越好,所以可以从最高位开始取反找,如果有就选,没有就只能选相同的
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
const int N=100000*32+5;//注意这个地方要开足够
int t,n,m,x,sz;
int ch[N][3];
int val[N];
void Inser(int x)
{
int l=31,y=x,u=0,v;
int a[33]={0};
while(x)
{
a[l]=x%2;
x/=2;
l--;
}
for(int i=0; i<32; i++)//从高位到低位储存
{
v=a[i];
if(!ch[u][v])
{
memset(ch[sz],0,sizeof(ch[sz]));
ch[u][v]=sz++;
}
u=ch[u][v];
}
val[u]=y;
}
int Find(int x)
{
int l=31,u=0,v;
int a[33]= {0};
while(x)
{
a[l]=x%2;
x/=2;
l--;
}
for(int i=0; i<32; i++)
{
v=1-a[i];//每位取反
if(ch[u][v]) u=ch[u][v];
else u=ch[u][a[i]];
}
return val[u];
}
void ini()
{
sz=1;
memset(ch[0],0,sizeof(ch[0]));
}
int main()
{
scanf("%d",&t);
for(int k=1; k<=t; k++)
{
ini();
scanf("%d%d",&n,&m);
printf("Case #%d:\n",k);
for(int i=1; i<=n; i++)
{
scanf("%d",&x);
Inser(x);
}
for(int i=1; i<=m; i++)
{
scanf("%d",&x);
printf("%d\n",Find(x));
}
}
return 0;
}