Cod sursa(job #415314)

Utilizator DraStiKDragos Oprica DraStiK Data 11 martie 2010 09:19:17
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include <algorithm>
using namespace std;

#define SIGMA 26

char buff[SIGMA];

struct trie
{
    trie *fiu[SIGMA];
    int cnt,nrfii;

    trie ()
    {
        cnt=nrfii=0;
        memset (fiu,0,sizeof (fiu));
    }
} *arb=new trie;

void ins (trie *nod,char *sir)
{
    if (*sir=='\n')
    {
        ++nod->cnt;
        return ;
    }
    if (!nod->fiu[*sir-'a'])
    {
        nod->fiu[*sir-'a']=new trie;
        ++nod->nrfii;
    }
    ins (nod->fiu[*sir-'a'],sir+1);
}

bool del (trie *nod,char *sir)
{
    if (*sir=='\n')
        --nod->cnt;
    else if (del (nod->fiu[*sir-'a'],sir+1))
    {
        nod->fiu[*sir-'a']=0;
        --nod->nrfii;
    }
    if (!nod->cnt && !nod->nrfii && nod!=arb)
    {
        delete nod;
        return 1;
    }
    return 0;
}

int query (trie *nod,char *sir)
{
    if (*sir=='\n')
        return nod->cnt;
    if (nod->fiu[*sir-'a'])
        return query (nod->fiu[*sir-'a'],sir+1);
    return 0;
}

int prefix (trie *nod,char *sir,int nrt)
{
    if (*sir=='\n' || !nod->fiu[*sir-'a'])
        return nrt;
    return prefix (nod->fiu[*sir-'a'],sir+1,nrt+1);
}

void read_solve ()
{
    int i;

    for (i=1; fgets (buff,SIGMA,stdin); ++i)
    {
        if (buff[0]=='0')
            ins (arb,buff+2);
        if (buff[0]=='1')
            del (arb,buff+2);
        if (buff[0]=='2')
            printf ("%d\n",query (arb,buff+2));
        if (buff[0]=='3')
            printf ("%d\n",prefix (arb,buff+2,0));
    }
}

int main ()
{
    freopen ("trie.in","r",stdin);
    freopen ("trie.out","w",stdout);

    read_solve ();

    return 0;
}