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 }