建立字典树就可以快速查找了。。。
#include <iostream>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <bitset>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <climits>
#include <cstdlib>
#include <cmath>
#include <time.h>
#define maxn 5000005
#define maxm 4000005
#define eps 1e-10
#define mod 1000000007
#define INF 1e9
#define lowbit(x) (x&(-x))
#define mp make_pair
#define ls o<<1
#define rs o<<1 | 1
#define lson o<<1, L, mid
#define rson o<<1 | 1, mid+1, R
typedef long long LL;
typedef unsigned long long ULL;
//typedef int LL;
using namespace std;
struct node
{
LL x;
node *next[2];
}*top, *root, pool[maxm], *now;
int n, m;
node* newnode(void)
{
top->x = 0;
top->next[0] = top->next[1] = NULL;
return top++;
}
void init(void)
{
top = pool;
root = newnode();
}
void insert(LL x)
{
now = root;
for(int i = 59; i >= 0; i--) {
int t = (x >> i) & 1;
if(!now->next[t]) now->next[t] = newnode();
now = now->next[t];
}
now->x = x;
}
void read(void)
{
LL x;
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++) {
scanf("%I64d", &x);
insert(x);
}
}
void work(void)
{
LL x;
while(m--) {
scanf("%I64d", &x);
now = root;
for(int i = 59; i >= 0; i--) {
int t = (x >> i) & 1;
t ^= 1;
if(now->next[t]) now = now->next[t];
else now = now->next[t^1];
//printf("%d\n", t);
}
printf("%I64d\n", now->x);
}
}
int main(void)
{
int _, __;
while(scanf("%d", &_)!=EOF) {
__ = 0;
while(_--) {
init();
read();
printf("Case #%d:\n", ++__);
work();
}
}
return 0;
}