题解:
第一次知道字典树还能这样用,果然还是做题太少了。。ORZ,感觉很多异或的题都可以用字典树去解决
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int MAXN=100000+7;
struct node
{
int next[2];
int cnt;
int w;
}t[MAXN*33];
int a[MAXN],num[33],tot;
void insert(int x)
{
int u=0;
for(int i=31;i>=0;i--)
{
int temp=((x>>i)&1);
// printf("temp=%d u=%d\n",temp,u);
if(!t[u].next[temp])
t[u].next[temp]=++tot;
u=t[u].next[temp];
}
// printf("%d\n",u);
t[u].w=x;
}
int query(int x)
{
int u=0;
for(int i=31;i>=0;i--)
{
int temp=((x>>i)&1);
if(t[u].next[temp^1])
u=t[u].next[temp^1];
else
u=t[u].next[temp];
}
return t[u].w;
}
int main()
{
int T,n,m,Case=1;
scanf("%d",&T);
while(T--)
{
tot=0;
memset(t,0,sizeof(t));
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
insert(a[i]);
}
printf("Case #%d:\n",Case++);
for(int i=1;i<=m;i++)
{
int x;
scanf("%d",&x);
printf("%d\n",query(x));
}
}
}