就是一个模板
注意这题有一个要求:有一个额外的0一直保持在集合中
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 const int _LEN=30; 5 //上限为2^30-1,即二进制最多30位 6 int lft[40]; 7 namespace Trie 8 { 9 int ch[7001000][2],sz[7001000]; 10 int mem; 11 void insert(int x,int cur) 12 { 13 int i;bool t; 14 for(i=_LEN-1;i>=0;--i) 15 { 16 t=x&lft[i]; 17 if(!ch[cur][t]) ch[cur][t]=++mem; 18 ++sz[cur];cur=ch[cur][t]; 19 } 20 ++sz[cur]; 21 } 22 int query(int x,int cur) 23 { 24 int i,ans=0;bool t; 25 for(i=_LEN-1;i>=0;--i) 26 { 27 t=x&lft[i]; 28 if(sz[ch[cur][t^1]]) ans|=lft[i],cur=ch[cur][t^1]; 29 else cur=ch[cur][t]; 30 } 31 return ans; 32 } 33 void erase(int x,int cur) 34 { 35 int i;bool t; 36 for(i=_LEN-1;i>=0;--i) 37 { 38 t=x&lft[i]; 39 --sz[cur];cur=ch[cur][t]; 40 } 41 --sz[cur]; 42 } 43 }; 44 int root; 45 char ss[10]; 46 int main() 47 { 48 int i,q,x; 49 lft[0]=1; 50 for(i=1;i<=_LEN;i++) lft[i]=lft[i-1]<<1; 51 root=++Trie::mem;Trie::insert(0,root); 52 scanf("%d",&q); 53 while(q--) 54 { 55 scanf("%s%d",ss,&x); 56 if(ss[0]==‘+‘) 57 { 58 Trie::insert(x,root); 59 } 60 else if(ss[0]==‘-‘) 61 { 62 Trie::erase(x,root); 63 } 64 else if(ss[0]==‘?‘) 65 { 66 printf("%d\n",Trie::query(x,root)); 67 } 68 } 69 return 0; 70 }