You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
1.9 KiB
C++
79 lines
1.9 KiB
C++
#include <cstdio>
|
|
inline int max(int a, int b) { return (a > b ? a : b); }
|
|
struct Node
|
|
{
|
|
int size;
|
|
Node* ch[2], *fa;
|
|
Node() { fa = ch[0] = ch[1] = 0, size = 0; }
|
|
};
|
|
typedef Node* lpNode;
|
|
struct Trie
|
|
{
|
|
lpNode root;
|
|
Trie() :root(new Node()) { }
|
|
void insert(int x)
|
|
{
|
|
lpNode cur = root; cur->size++;
|
|
for (int i = 31; i >= 0; i--)
|
|
{
|
|
int id = (x >> i) & 1;
|
|
if (cur->ch[id] == 0)
|
|
cur->ch[id] = new Node(), cur->ch[id]->fa = cur;
|
|
cur = cur->ch[id];
|
|
cur->size++;
|
|
}
|
|
}
|
|
void remove(int x)
|
|
{
|
|
lpNode cur = root; cur->size--;
|
|
for (int i = 31; i >= 0; i--)
|
|
{
|
|
cur = cur->ch[(x >> i) & 1];
|
|
cur->size--;
|
|
}
|
|
while (cur->fa != 0 && cur->size == 0)
|
|
cur->fa->ch[cur == cur->fa->ch[1]] = 0, cur = cur->fa;
|
|
}
|
|
int query(int x)
|
|
{
|
|
x = ~x;
|
|
int ans = 0;
|
|
lpNode p = root;
|
|
for (int i = 31; i >= 0; i--)
|
|
{
|
|
ans <<= 1;
|
|
if ((x >> i) & 1 && p)
|
|
if (p->ch[1])
|
|
p = p->ch[1], ans++;
|
|
else
|
|
p = p->ch[0];
|
|
else
|
|
if (p->ch[0])
|
|
p = p->ch[0];
|
|
else
|
|
p = p->ch[1], ans++;
|
|
}
|
|
return ans;
|
|
}
|
|
};
|
|
int main()
|
|
{
|
|
int q, tmp;
|
|
char ch;
|
|
Trie t;
|
|
t.insert(0);
|
|
scanf("%d", &q);
|
|
for (int i = 0; i < q; i++)
|
|
{
|
|
ch = getchar();
|
|
while (ch != '+' && ch != '-' && ch != '?') ch = getchar();
|
|
scanf("%d", &tmp);
|
|
if (ch == '+')
|
|
t.insert(tmp);
|
|
else if (ch == '-')
|
|
t.remove(tmp);
|
|
else if (ch == '?')
|
|
printf("%d\n", t.query(tmp) ^ tmp);
|
|
}
|
|
return 0;
|
|
} |