[hdu 4825]字典树
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4825
字典树入门题
#include<bits/stdc++.h> using namespace std; const int maxn=100005; struct Node { int ch[2]; void init() { ch[0]=ch[1]=-1; } }; struct Trie { Node node[maxn*33]; int tot; void init() { tot=0; node[0].init(); } void insert(long long x) { int tmp[33]; for (int i=0;i<33;i++) { tmp[i]=x&1; x>>=1; } // printf("insert "); // for (int i=32;i>=0;i--) // { // printf("%d",tmp[i]); // } // printf("\n"); int now=0; for (int i=32;i>=0;i--) { if (node[now].ch[tmp[i]]==-1) { node[++tot].init(); node[now].ch[tmp[i]]=tot; } now=node[now].ch[tmp[i]]; } } long long query(long long x) { int tmp[33]; for (int i=0;i<33;i++) { tmp[i]=x&1; x>>=1; } // printf("query :"); // for (int i=32;i>=0;i--) // { // printf("%d",tmp[i]); // } // printf("\n"); long long ans=0; int now=0; for (int i=32;i>=0;i--) { if (node[now].ch[1-tmp[i]]!=-1) { ans=(ans<<1)|(1-tmp[i]); now=node[now].ch[1-tmp[i]]; } else { ans=(ans<<1)|tmp[i]; now=node[now].ch[tmp[i]]; } } return ans; } }T; int main() { int t; scanf("%d",&t); for (int cas=1;cas<=t;cas++) { int n,m; scanf("%d%d",&n,&m); T.init(); for (int i=1;i<=n;i++) { long long x; scanf("%I64d",&x); T.insert(x); } printf("Case #%d:\n",cas); for (int i=1;i<=m;i++) { long long x; scanf("%I64d",&x); printf("%I64d\n",T.query(x)); } } return 0; }