Vasiliy's Multiset CodeForces -706D || 01字典树模板

就是一个模板

注意这题有一个要求:有一个额外的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 }
posted @ 2018-04-04 18:08  hehe_54321  阅读(172)  评论(0编辑  收藏  举报
AmazingCounters.com