Cod sursa(job #341291)

Utilizator RobybrasovRobert Hangu Robybrasov Data 17 august 2009 22:57:55
Problema Hashuri Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <cstdio>
#include <cstring>
#define N 1000001

struct trie
{
    short int cuv,fii;
    trie *L[10];

    trie()
    {
        cuv=fii=0;
        memset(L,0,sizeof(L));
    }
} *T;

char S[20];

void insert(trie *t, char *c)
{
    if (*c=='\n') t->cuv=1;
    else
    {
        int ch=*c-'0';
        if (!t->L[ch])
        {
            t->L[ch]=new trie;
            t->fii++;
        }
        insert(t->L[ch],c+1);
    }
}

int exist(trie *t, char *c)
{
    if (*c=='\n') return t->cuv;
    else
        if (t->L[*c-'0']) return exist(t->L[*c-'0'],c+1);
        else return 0;
}

int erase(trie * &t, char *c)
{
    if (*c=='\n') t->cuv=0;
    else
        if (erase(t->L[*c-'0'],c+1))
        {
            t->fii--;
            t->L[*c-'0']=0;
        }

    if (!t->cuv && !t->fii && t!=T)
    {
        delete t;
        return 1;
    }
    else return 0;
}

int main()
{
    T=new trie;
    int n;
	freopen("hashuri.in","r",stdin);
	freopen("hashuri.out","w",stdout);
    scanf("%d\n",&n);
    while (n--)
    {
        fgets(S,20,stdin);
        switch (S[0])
        {
            case '1':insert(T,S+2); break;
            case '2':if (exist(T,S+2)) erase(T,S+2); break;
            case '3':printf("%d\n",exist(T,S+2)); break;
        }
    }

    return 0;
}