Cod sursa(job #1333820)

Utilizator rsteliRadu Stelian rsteli Data 3 februarie 2015 16:40:00
Problema Deque Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <cstdio>
using namespace std;

int tip;
char s[30];
struct trie
{
    int ap,fii;
    trie *v[26];
    trie()
    {
        int i;
        ap=0;
        fii=0;
        for (i=0;i<26;i++)
            v[i]=0;
    }
};
trie *t=new trie;

void inserare(trie *nod,char *p)
{
    if (*p==0)
    {
        nod->ap++;
        return;
    }
    if (nod->v[*p-'a']==0)
        {
            nod->v[*p-'a']=new trie;
            nod->fii++;
        }
    inserare(nod->v[*p-'a'],p+1);
}

int stergere(trie *nod,char *p)
{
    if (*p==0)
    {
        nod->ap--;
    }
    else if (stergere(nod->v[*p-'a'],p+1))
    {
        nod->v[*p-'a']=0;
        nod->fii--;
    }
    if (nod->ap==0 && nod->fii==0 && nod!=t)
    {
        delete nod;
        return 1;
    }
    return 0;
}

int num(trie *nod,char *p)
{
    if (*p==0)
        return nod->ap;
    if (nod->v[*p-'a'])
        return num(nod->v[*p-'a'],p+1);
    return 0;
}

int pref(trie *nod,char *p,int k)
{
    if (*p==0 || nod->v[*p-'a']==0)
        return k;
    return pref(nod->v[*p-'a'],p+1,k+1);
}

int main()
{
    int i,j;
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    while (scanf("%d%s",&tip,&s)!=-1)
    {
        if (tip==0)
        {
            inserare(t,s);
        }
        else if (tip==1)
        {
            stergere(t,s);
        }
        else if (tip==2)
        {
            printf("%d\n",num(t,s));
        }
        else
        {
            printf("%d\n",pref(t,s,0));
        }
    }
}