2 3 2 3 4 5 1 5 4 1 4 6 5 6 3
Case #1: 4 3 Case #2: 4
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<iostream>
#include<cstdlib>
#define N 100010
using namespace std;
int n,k,m;
char s[40];
int a[N];
struct Trie {
int id;
struct Trie *Next[2];
Trie() {
id=0;
for(int i=0; i<2; i++)
Next[i]=NULL;
}
};
void Trie_Inser(Trie *p,char s[],int id) {
int i=0;
Trie *q=p;
while(i<=32) {
int nx=s[i]-'0';
if(q->Next[nx]==NULL) {
q->Next[nx]=new Trie;
}
q=q->Next[nx];
i++;
}
q->id=id;
}
int Trie_Serch(Trie *p,char s[]) {
int i=0;
Trie *q=p;
while(i<=32) {
int nx=s[i]-'0';
if(q->Next[nx]==NULL)nx^=1;
q=q->Next[nx];
i++;
}
return q->id;
}
int main() {
// freopen("test.in","r",stdin);
int t;
cin>>t;
int ca=1;
while(t--) {
scanf("%d%d",&n,&m);
int x;
Trie *p=new Trie;
for(int i=1; i<=n; i++) {
scanf("%d",&x);
a[i]=x;
for(int i=0; i<40; i++)s[i]='0';
int l=32;
while(x) {
if(x&1) {
s[l]='1';
}
x>>=1;
l--;
}
Trie_Inser(p,s,i);
}
printf("Case #%d:\n",ca++);
while(m--) {
scanf("%d",&x);
for(int i=0; i<40; i++)s[i]='1';
int l=32;
while(x) {
if(x&1) {
s[l]='0';
}
x>>=1;
l--;
}
int id=Trie_Serch(p,s);
printf("%d\n",a[id]);
}
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/acm_baihuzi/article/details/46919599