Pagini recente » Cod sursa (job #2321492) | Cod sursa (job #423724) | Cod sursa (job #1575695) | Cod sursa (job #473303) | Cod sursa (job #2090022)
#include <bits/stdc++.h>
using namespace std;
struct Trie {
int ends;
int counter;
Trie* next[2];
Trie();
}*root;
Trie::Trie() {
ends = counter = 0;
for (int i = 0; i < 2; i++)
next[i] = NULL;
}
void trieInsert(Trie*& node, int p) {
if(!p) {
node->ends++;
return;
}
if(!node->next[p % 2]) {
node->next[p % 2] = new Trie;
node->counter++;
}
trieInsert(node->next[p % 2], p / 2);
}
bool trieRemove(Trie*& node, int p) {
if(!p) {
node->ends--;
} else{
if(!node->next[p % 2]) return false;
if(trieRemove(node->next[p % 2], p / 2)) {
node->next[p % 2] = NULL;
node->counter--;
}
}
if(!node->ends && !node->counter && node != root) {
delete node;
return true;
}
return false;
}
bool trieSearch(Trie*& node, int p) {
if(!p) {
return node->ends;
}
if(!node->next[p % 2])
return 0;
return trieSearch(node->next[p % 2], p / 2);
}
int n;
int main() {
root = new Trie;
freopen("hashuri.in", "r", stdin);
freopen("hashuri.out", "w", stdout);
scanf("%d ", &n);
for (int i = 1; i <= n; i++) {
int op, arg;
scanf("%d %d ", &op, &arg);
if (op == 1) trieInsert(root, arg);
else if (op == 2) trieRemove(root, arg);
else printf("%d\n", trieSearch(root, arg));
}
return 0;
}