Cod sursa(job #407625)

Utilizator ZillaMathe Bogdan Zilla Data 2 martie 2010 15:06:30
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#include <stdio.h>
#include <string.h>

#define PopC *s-'a'

struct Trie{
    int nrfii,cnt;
    Trie *fiu[26];
    Trie()
        {
            int i;
            cnt=nrfii=0;
            for(i=0;i<26;++i)
                fiu[i]=0;
        }
};

Trie *T=new Trie;

void insert(Trie *nod, char *s)
{
    if(*s=='\n')
        {
            nod->cnt++;
            return ;
        }
    if(nod->fiu[ PopC ] == 0)
        {
            nod->fiu [ PopC ] = new Trie; // Trie and Fail
            nod->nrfii++;
        }

    insert(nod->fiu [ PopC] , s+1);
}

int del(Trie *nod, char *s)
{
    if(*s=='\n')
        nod->cnt--;
    else
        if(del(nod->fiu[ PopC],s+1))
            {
                nod->fiu[PopC]=0;
                nod->nrfii--;
            }
    if(nod->cnt == 0 && nod->nrfii == 0 && nod!=T)
        {
            delete nod;
            return 1;
        }
    return 0;
}

int querry(Trie *nod,char *s)
{
    if(*s=='\n')
        return nod->cnt;
    if(nod->fiu[PopC])
        return querry(nod->fiu[PopC],s+1);
    return 0;
}

int pref(Trie *nod,char *s,int n)
{
    if(*s=='\n' || nod->fiu[PopC]==0)
        return n;
    return pref(nod->fiu[PopC],s+1,n+1);
}

int main()
{
    char buff[32];

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

    fgets(buff , 32 ,stdin);

    while(!feof(stdin))
        {
            switch(buff[0])
                {
                    case '0':insert( T , buff+2); break;
                    case '1':del(T, buff+2); break;
                    case '2':printf("%d\n",querry(T,buff+2)); break;
                    case '3':printf("%d\n",pref(T,buff+2,0)); break;
                }
            fgets(buff , 32 ,stdin);
        }

    return 0;
}