Pagini recente » Cod sursa (job #604589) | Cod sursa (job #2875861) | Cod sursa (job #1278557) | Cod sursa (job #1272453) | Cod sursa (job #1556638)
#include <iostream>
#include <cstdio>
#include <cstring>
#define radix 2
#define mask ((1<<2)-1)
#define MAXLVL 16
using namespace std;
struct trieNod
{
short nOfSons;
trieNod *son[1<<radix];
trieNod()
{
nOfSons = 0;
memset(son, 0, sizeof(son));
}
};
trieNod *root = new trieNod();
void addKey(int key, trieNod *crt = root, int lvl = 0)
{
if (lvl == MAXLVL) return;
if (crt->son[key&mask] == NULL) {
crt->son[key&mask] = new trieNod();
crt->nOfSons++;
}
addKey(key>>radix, crt->son[key&mask], lvl+1);
}
int get(int key, trieNod *crt = root, int lvl = 0)
{
if (lvl == MAXLVL) return 1;
if (crt->son[key&mask] == NULL) return 0;
get(key>>radix, crt->son[key&mask], lvl+1);
}
/// returns 1 if nod is removed
int removeKey(int key, trieNod *crt = root, int lvl = 0)
{
if (crt == NULL) return 0;
if (lvl == MAXLVL) {
delete crt;
return 1;
}
if (removeKey(key>>radix, crt->son[key&mask], lvl+1)) {
crt->son[key&mask] = NULL;
crt->nOfSons--;
if (crt->nOfSons == 0) {
delete crt;
return 1;
}
}
return 0;
}
int main()
{
freopen("hashuri.in", "r", stdin);
freopen("hashuri.out", "w", stdout);
int n, op, key;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d %d", &op, &key);
switch (op) {
case 1: addKey(key); break;
case 2: removeKey(key); break;
default: printf("%d\n", get(key));
}
}
return 0;
}