Cod sursa(job #1556638)

Utilizator TimitocArdelean Andrei Timotei Timitoc Data 25 decembrie 2015 16:03:31
Problema Hashuri Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#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;
}