题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=4825
题意
给你一个数列,然后m次询问,每次询问给出一个x,问x和数列中某个数异或的最大值。
思路
10Trie树的模板题,这个题只有增加,没有删除。
代码
#define push_back pb
#define make_pair mk
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#include<cmath>
#include<map>
#include<algorithm>
#include<string>
#include<string.h>
#include<set>
#include<queue>
#include<stack>
#include<functional>
using std::pair;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int>PII;
const double PI=acos(-1);
const int maxn = 1e3 + 10;
const int maxm = 1e5 + 10;
const int INF = 0x3f3f3f3f;
const int mod =1e9+7;
const ll inf =1e18;
using namespace std;
int n,cnt,trie[maxn][2],q;
void insert(int n)
{
int rt=1;
for(int i=31;i>=0;i--)
{
int t=(n>>i)&1;
if(trie[rt][t]==0) trie[rt][t]=++cnt;
rt=trie[rt][t];
}
}
int query(int n)
{
int res=0;
int rt=1;
for(int i=31;i>=0;i--)
{
int t=((n>>i)&1)^1;
if(!trie[rt][t]) t^=1;
res|=t<<i;
rt=trie[rt][t];
}
return res;
}
int main()
{
int t;
cin>>t;
int tt=0;
while(t--)
{
tt++;
memset(trie,0,sizeof(trie));
scanf("%d%d",&n,&q);
cnt=1;
int tmp;
for(int i=0;i<n;i++)
{
scanf("%d",&tmp);
insert(tmp);
}
printf("Case #%d:\n",tt);
while(q--)
{
scanf("%d",&tmp);
printf("%d\n",query(tmp));
}
}
}