Cod sursa(job #425056)

Utilizator hasegandaniHasegan Daniel hasegandani Data 25 martie 2010 14:25:01
Problema Trie Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include<stdio.h>
#include<string.h>

#define Nmax 31
#define Sgm 28
#define Ch *s-'a'

struct Trie
{
    int cnt,nrfii;
    Trie *fiu[ Sgm ];

    Trie()
    {
        cnt=nrfii=0;
        memset(fiu,0,sizeof(fiu));
    }
};

Trie *T=new Trie;
char S[Nmax];

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

    ins( nod->fiu[Ch] , s+1);
}

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

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

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

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

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

    while(!feof(stdin))
        {
        fgets(S,Nmax,stdin);
        if (S[0]=='0')
            ins(T,S+2);
        if (S[0]=='1')
            del(T,S+2);
        if (S[0]=='2')
            printf("%d\n",que(T,S+2));
        if (S[0]=='3')
            printf("%d\n",pre(T,S+2,0));
        }

    return 0;
}