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