参考。。http://blog.csdn.net/viphong/article/details/52167649
注意要先插入0。。。特判一下0不能删除
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
#include <map>
#include <vector>
using namespace std;
#define inf 2147483647
const int maxnode = 200005*32;
struct trie
{
int ch[maxnode][2];
int val[maxnode];
int sz;
void init()
{
sz=1;
val[0]=0; //可不需要
memset(ch[0],0,sizeof(ch[0]));
}
void insert(int s )
{
int u=0,n=31,i;
for (i=0; i<n; i++)
{
int c=s&(1<<(30-i));
c=!!c;
if (!ch[u][c])
{
memset(ch[sz],0,sizeof(ch[sz]));
val[sz]=1;
ch[u][c]=sz++;
}
else
val[ch[u][c]]++;
u=ch[u][c];
}
// val[u]=num;
}
void del(int s )
{
int u=0,n=31,i;
for (i=0; i<n; i++)
{
int c=s&(1<<(30-i));
c=!!c;
val[ch[u][c]]--;
u=ch[u][c];
}
// val[u]=num;
}
int query_if(int s)
{
int ret=0;
int u=0,n=31,i;
int nex;
for (i=0; i<n; i++)
{
int c=s&(1<<(30-i));
c=!!c;
if (ch[u][c^1]>0&&val[ch[u][c^1]]>0)
c^=1;
ret|=c<<(30-i);
u=ch[u][c];
}
return ret;
}
};
trie tp;
int main()
{
// while(scanf("%d",&n)!=EOF)
int n;
cin>>n;
tp.init();
tp.insert(0);
char tmp[5];
int x;
for (int i=1; i<=n; i++)
{
scanf("%s%d",tmp,&x);
if (tmp[0]=='+')
{
if (x)
tp.insert(x);
}
else if (tmp[0]=='-')
{
if (x)
tp.del(x);
}
else
printf("%d\n",tp.query_if(x)^x);
}
return 0;
}