字典樹 hdu-4825 Xor Sum 為例
阿新 • • 發佈:2018-12-11
題目連結不發了。
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=100005; int trie[maxn*30][2],tot,consi[35]; void Insert(){ int rt=0; for(int i=1;i<=32;i++){ int now=consi[i]; if(!trie[rt][now]) trie[rt][now]=++tot; rt=trie[rt][now]; } } void deal(int x){ int num=32; while(num){ if(x&1) consi[num]=1; else consi[num]=0; num--; x/=2; } } ll Search(){ ll ans=0; int rt=0; for(int i=1;i<=32;i++){ int a=consi[i]; a^=1; int wei=32-i; if(trie[rt][a]){ if(a==1) ans=ans+(1<<wei); rt=trie[rt][a]; } else { if(a==0) ans=ans+(1<<wei); a^=1; rt=trie[rt][a]; } } return ans; } int main(){ int t,cas=0,n,q,x; cin>>t; while(t--){ memset(trie,0,sizeof(trie)); tot=0; scanf("%d%d",&n,&q); for(int i=1;i<=n;i++){ scanf("%d",&x); deal(x); Insert(); } printf("Case #%d:\n",++cas); while(q--){ scanf("%d",&x); deal(x); printf("%lld\n",Search()); } } return 0; }