Codeforces Round #367 (Div. 2) D. Vasiliy's Multiset

题目链接:Codeforces Round #367 (Div. 2) D. Vasiliy's Multiset

题意:

给你一些操作,往一个集合插入和删除一些数,然后?x让你找出与x异或后的最大值

题解:

trie树xjb搞就行,每次要贪心,尽量满足高位为1.

 1 #include<bits/stdc++.h>
 2 #define F(i,a,b) for(int i=a;i<=b;i++)
 3 using namespace std;
 4 
 5 namespace trie
 6 {
 7     const int N=(2e5+7)*32;
 8     int tr[N][2],ed=-1,cnt[N];
 9     void nw(){cnt[++ed]=0,tr[ed][0]=tr[ed][1]=0;}
10     void update(int x,int c,int now=0)
11     {
12         for(int i=30;i>=0;i--)
13         {
14             int v=x>>i&1;
15             if(!tr[now][v])nw(),tr[now][v]=ed;
16             now=tr[now][v];
17             cnt[now]+=c;
18         }
19     }
20     int ask(int x,int now=0,int ans=0)
21     {
22         for(int i=30;i>=0;i--)
23         {
24             int v=x>>i&1;
25             if(!cnt[tr[now][v^1]])now=tr[now][v];
26             else now=tr[now][v^1],ans|=1<<i;
27         }
28         return ans;
29     }
30 }
31 using namespace trie;
32 int main()
33 {
34     int n,x;char op[2];
35     scanf("%d",&n);
36     nw(),update(0,1);
37     F(i,1,n)
38     {
39         scanf("%s%d",op,&x);
40         if(op[0]=='+')update(x,1);
41         else if(op[0]=='-')update(x,-1);
42         else printf("%d\n",ask(x));
43     }
44     return 0;
45 }
View Code

 

posted @ 2016-08-12 18:36  bin_gege  阅读(121)  评论(0编辑  收藏  举报