Cod sursa(job #526546)

Utilizator DraStiKDragos Oprica DraStiK Data 28 ianuarie 2011 16:52:59
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <algorithm>
using namespace std;

#define SIGMA 26
#define DIM 25

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

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

char buff[DIM];
int lg;

void insert (trie *nod,int poz)
{
    if (poz>lg)
    {
        ++nod->cnt;
        return ;
    }
    if (!nod->fiu[buff[poz]-'a'])
    {
        nod->fiu[buff[poz]-'a']=new trie;
        ++nod->nrfii;
    }
    insert (nod->fiu[buff[poz]-'a'],poz+1);
}

int remove (trie *nod,int poz)
{
    if (poz>lg)
        --nod->cnt;
    else if (remove (nod->fiu[buff[poz]-'a'],poz+1))
    {
        nod->fiu[buff[poz]-'a']=0;
        --nod->nrfii;
    }

    if (!nod->cnt && !nod->nrfii && nod!=arb)
    {
        delete nod;
        return 1;
    }
    return 0;
}

int query (trie *nod,int poz)
{
    if (poz>lg)
        return nod->cnt;
    if (!nod->fiu[buff[poz]-'a'])
        return 0;
    return query (nod->fiu[buff[poz]-'a'],poz+1);
}

int prefix (trie *nod,int poz)
{
    if (poz>lg || !nod->fiu[buff[poz]-'a'])
        return 0;
    return 1+prefix (nod->fiu[buff[poz]-'a'],poz+1);
}

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

    for (; fgets (buff+1,DIM,stdin); )
    {
        lg=strlen (buff+1)-(buff[strlen (buff+1)]=='\n');
        if (buff[1]=='0')
            insert (arb,3);
        else if (buff[1]=='1')
            remove (arb,3);
        else if (buff[1]=='2')
            printf ("%d\n",query (arb,3));
        else
            printf ("%d\n",prefix (arb,3));
    }

    return 0;
}