题解:
01字典树模板题。直接套用模板,将数组中的数插入到 01字典树,对每一个数查询即可。
代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#define ll long long
#define inf 0x3f3f3f3f
const int MAXN=110000;
int n,m,t;
int tree[32*MAXN][2];
ll val[32*MAXN];
int tot=0;
void insert(ll d)
{
int root=0;
for(int i=32;i>=0;i--)
{
int id=(d>>i)&1;//获得这一个bit位的值
if(!tree[root][id]) tree[root][id]=++tot;
root=tree[root][id];
}
val[root]=d;
}
ll query(ll d)
{
int root=0;
for(int i=32;i>=0;i--)
{
int id=(d>>i)&1;
if(tree[root][id^1]) root=tree[root][id^1];
else root=tree[root][id];
}
return val[root];
}
int main()
{
int a;
scanf("%d",&t);
int ca=0;
while(t--)
{
memset(tree,0,sizeof(tree));
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
{
scanf("%d",&a);
insert(a);
}
printf("Case #%d:\n",++ca);
for(int i=0;i<m;i++)
{
ll d;
scanf("%I64d",&d);
printf("%I64d\n",query(d));
}
}
return 0;
}