HDU4825 01字典樹模板題
阿新 • • 發佈:2019-01-29
題解: 第一次知道字典樹還能這樣用,果然還是做題太少了。。ORZ,感覺很多異或的題都可以用字典樹去解決
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int MAXN=100000+7; struct node { int next[2]; int cnt; int w; }t[MAXN*33]; int a[MAXN],num[33],tot; void insert(int x) { int u=0; for(int i=31;i>=0;i--) { int temp=((x>>i)&1); // printf("temp=%d u=%d\n",temp,u); if(!t[u].next[temp]) t[u].next[temp]=++tot; u=t[u].next[temp]; } // printf("%d\n",u); t[u].w=x; } int query(int x) { int u=0; for(int i=31;i>=0;i--) { int temp=((x>>i)&1); if(t[u].next[temp^1]) u=t[u].next[temp^1]; else u=t[u].next[temp]; } return t[u].w; } int main() { int T,n,m,Case=1; scanf("%d",&T); while(T--) { tot=0; memset(t,0,sizeof(t)); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); insert(a[i]); } printf("Case #%d:\n",Case++); for(int i=1;i<=m;i++) { int x; scanf("%d",&x); printf("%d\n",query(x)); } } }