多重集版的异或字典树,拿之前的板子瞎改了改居然能用,看来功能理解得没错。。
莫名wa7,回忆一波代码意义之后感觉没问题啊
读读题发现这个多重集里居然永远有0
。。。
赛中能debug出来还是挺开心的
#include<bits/stdc++.h>
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<stdio.h>
#include<algorithm>
#include<queue>
#include<string.h>
#include<iostream>
#include<math.h>
#include<set>
#include<map>
#include<vector>
#include<iomanip>
using namespace std;
#define ll long long
#define pb push_back
#define FOR(a) for(int i=1;i<=a;i++)
const int inf=0x3f3f3f3f;
const int maxn=2e5+9;
const int maxnode=32*maxn;
int ch[maxnode][2];
int val[maxnode];
int vis[maxnode];
int sz;
void init(){memset(ch[0],0,sizeof ch[0]);sz=1;}
void insert(int num){
int now=0;
for(int i=30;i>=0;i--){
int c=(num>>i)&1;
if(!ch[now][c]){
memset(ch[sz],0,sizeof ch[sz]);
val[sz]=0;
vis[sz]=0;
ch[now][c]=sz++;
}
now=ch[now][c];
vis[now]++;
}
val[now]=num;
}
void del(int num){
int now=0;
for(int i=30;i>=0;i--){
int c=(num>>i)&1;
now=ch[now][c];
vis[now]--;
}
}
int query(int num){
int now=0;
for(int i=30;i>=0;i--){
int c=(num>>i)&1;
if(ch[now][c^1] && vis[ch[now][c^1]])now=ch[now][c^1];
else if(vis[ch[now][c]])now=ch[now][c];
else{
return 0;
}
}
return val[now];
}
char op[5];int num;
int main(){
init();
int n;scanf("%d",&n);
while(n--){
scanf("%s%d",op,&num);
if(op[0]=='+')insert(num);
else if(op[0]=='-')del(num);
else printf("%d\n",max(num,num^query(num)));
}
}