Codeforces Round #367 (Div. 2) D——Vasiliy's Multiset(異或字典樹)
新技能get啊。
以前都不知道這種用字典樹搞。
關於字典樹的入門可以看這個 http://blog.csdn.net/say_c_box/article/details/52073513
查詢操作就是,找到可以讓該位為1的兒子節點,向下訪問。因為越高位是1數就越大嘛。
最多不過30層,所以直接建30層的樹即可。
有一句一定要注意:Note, that the integer 0 will always be present in the set A.
#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <cmath>
#include <cstdlib>
using namespace std;
const int MAXN =100000+10;
const long long INF =100000000000007;
struct node{
node *next[2];
int cnt;
node(){
memset(next,NULL,sizeof(next));
cnt=0;
}
};
node *p,*root=new node();
void _insert(int x){
p=root;
for(int i=30;i>=0;i--){
int num=x&(1<<i)?1:0;
if(p->next[num]==NULL)
p->next[num]=new node();
p=p->next[num];
p->cnt++;
}
}
void _delete(int x){
p=root;
for(int i=30;i>=0;i--){
int num=x&(1<<i)?1:0;
p=p->next[num];
p->cnt--;
}
}
int query(int x){
int res=0;
p=root;
for(int i=30;i>=0;i--){
int num=x&(1<<i)?0:1;
node *temp;
temp=p->next[num];
if(temp&&temp->cnt>0){
res+=pow(2.0,i);
p=temp;
}
else{
p=p->next[!num];
}
}
return res;
}
int main(){
int q;
_insert(0);
scanf("%d",&q);
getchar();
while(q--){
char op[2];
int x;
scanf("%s%d",op,&x);
if(op[0]=='+')
_insert(x);
else if(op[0]=='-')
_delete(x);
else
printf("%d\n",query(x));
}
return 0;
}
相關文章
- Codeforces Round #452 (Div. 2) D
- Codeforces Round 941 (Div. 2) D
- Codeforces Round 960 (Div. 2)(A - D)
- Codeforces Round #325 (Div. 2) D bfs
- Codeforces Round #250 (Div. 2) A-D
- Codeforces Round #251 (Div. 2) A/B/D
- Codeforces Round #283 (Div. 2) D,E
- Codeforces Round #256 (Div. 2)A-D
- Codeforces Round #358 (Div. 2) D dp
- Codeforces Round #359 (Div. 2) D DFS
- Educational Codeforces Round 34 (Rated for Div. 2) D
- Codeforces Round #290 (Div. 2) A,B,C,D
- Codeforces Round #263 (Div. 2) A-D
- Codeforces Round 720 (Div. 2) A-D
- Codeforces Round #673 (Div. 2)(A-D)題解
- Codeforces Round #401 (Div. 2)(C,D,E)
- Codeforces Round #321 (Div. 2) D 狀壓dp
- Codeforces Round #360 (Div. 2) D 數學題
- Codeforces Round #288 (Div. 2) A,B,C,D,E
- Codeforces Round #287 (Div. 2)A,B,C,D,E
- Codeforces Round #253 (Div. 2) D. Andrey and Problem
- Codeforces Round #280 (Div. 2 A,B,C,D,E)
- Educational Codeforces Round 170 (Rated for Div. 2) A-D
- 【數論】Codeforces Round #404 (Div. 2)(D)Anton and School - 2
- Educational Codeforces Round 142 (Rated for Div. 2) A-D
- Codeforces Round #336 (Div. 2) D 區間dp
- Codeforces Round 960 (Div. 2) 補題記錄(A~D)
- CodeForces Round #951(Div. 2) 補題記錄(A~D)
- Codeforces Round 986 (Div. 2)題解記錄(A~D)
- Codeforces Round 987 (Div. 2)題解記錄(A~D)
- Codeforces Round #248 (Div. 2) A. Kitahara Haruki's Gift
- Codeforces Round #639 (Div. 2)
- Codeforces Round #541 (Div. 2)
- Codeforces Round #682 (Div. 2)
- Codeforces Round #678 (Div. 2)
- Codeforces Round #747 (Div. 2)
- Codeforces Round #673 (Div. 2)
- Codeforces Round #672 (Div. 2)