#include<bits/stdc++.h>
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<stdio.h>
#include<algorithm>
#include<queue>
#include<string.h>
#include<iostream>
#include<math.h>
#include<set>
#include<map>
#include<vector>
#include<iomanip>
using namespace std;
#define ll long long
#define pb push_back
#define FOR(a) for(int i=1;i<=a;i++)
const int inf=0x3f3f3f3f;
const int maxn=1e5+9;
const int maxnode=32*maxn;
int ch[maxnode][2];
int val[maxnode];
int sz;
void init(){memset(ch[0],0,sizeof ch[0]);sz=1;}
void insert(int num){
int now=0;
for(int i=30;i>=0;i--){
int c=(num>>i)&1;
if(!ch[now][c]){
memset(ch[sz],0,sizeof ch[sz]);
val[sz]=0;
ch[now][c]=sz++;
}
now=ch[now][c];
}
val[now]=num;
}
int query(int num){
int now=0;
for(int i=30;i>=0;i--){
int c=(num>>i)&1;
if(ch[now][c^1])now=ch[now][c^1];
else now=ch[now][c];
}
return val[now];
}
int T,n,q;
int main(){
int kase=0;
scanf("%d",&T);
while(T--){
init();
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++){
int x;
scanf("%d",&x);
insert(x);
}
printf("Case #%d:\n",++kase);
for(int i=1,x;i<=q;i++){
scanf("%d",&x);
printf("%d\n",query(x));
}
}
}
这题还挺直观的。。
要注意的是int正数只需要32个二进制格子(这啥,所以右移30次就遍历到最高位了