Cod sursa(job #690310)

Utilizator taloibogdanTaloi Bogdan Cristian taloibogdan Data 25 februarie 2012 15:31:24
Problema Trie Scor 15
Compilator cpp Status done
Runda Arhiva educationala Marime 1.95 kb
#include<stdio.h>
#include<string.h>
struct nod{long nr,nf;char c;nod* f[26];nod* t;};
nod* n;
nod* r;
nod* aux;
nod* nn;
long l,i,ll,m,x;
char s[100];
int main()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    r=new nod;
    r->nr=r->nf=r->c=0;
    memset(r->f,NULL,sizeof(r->f));
    r->t=NULL;
    while(gets(s))
    {
        l=strlen(s);
        if(s[0]=='0')
        {
            n=r;
            for(i=2;i<l;++i)
                if(n->f[s[i]-'a']!=NULL)n=n->f[s[i]-'a'];
                else
                {
                    n->nf++;
                    aux=new nod;
                    memset(aux->f,NULL,sizeof(aux->f));
                    aux->nf=aux->nr=0;
                    aux->c=s[i];
                    n->f[s[i]-'a']=aux;
                    aux->t=n;
                    n=aux;}
            n->nr++;
        }
        else
        if(s[0]=='1')
        {
            n=r;
            for(i=2;i<l;++i)
                n=n->f[s[i]-'a'];
            n->nr--;
            if(n->nr==0)
            {
                do
                {
                    aux=n;
                    n=n->t;
                    n->f[aux->c-'a']=NULL;
                    delete aux;
                }while(n->nf<=1&&n->nr==0);
                n->nf--;
            }

        }
        else
        if(s[0]=='2')
        {
            n=r;
            for(i=2;i<l&&n!=NULL;++i)
                n=n->f[s[i]-'a'];
            if(n==NULL)printf("0\n");
            else printf("%ld\n",n->nr);
        }
        else
        {
            n=r;
            for(i=2;i<l&&n!=NULL;++i)
                {nn=n;n=n->f[s[i]-'a'];}
            l=i-2;x=0;
            if(n==NULL)n=nn,x=1;
            l-=x;
            while(n!=r)
            {
                if(n->nf>1-x||n->nr!=0)break;
                n=n->t;--l;
            }
            printf("%ld\n",l);
        }
    }
    return 0;
}