Cod sursa(job #1251543)

Utilizator heracleRadu Muntean heracle Data 29 octombrie 2014 17:33:04
Problema Trie Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <cstdio>
#include <cstring>

FILE* in=fopen("trie.in","r");
FILE* out=fopen("trie.out","w");

struct Nod{
    int nrp,nrc;
    Nod* fii[26];

    Nod()
    {
        nrp=0;
        nrc=0;
        for(int i=0; i<26; i++)
        {
            fii[i]=NULL;
        }
    }
};

Nod *adauga(Nod *p, char *cuv)
{
    if(p==NULL)
        p=new Nod;
    p->nrp++;

    if(cuv[0]!=0)
        p->fii[cuv[0]-'a']=adauga(p->fii[cuv[0]-'a' ],cuv+1);
    else
        p->nrc++;
    return p;
}

Nod *sterge(Nod *p, char *cuv)
{
    p->nrp--;
    if(cuv[0]!=0)
        p->fii[cuv[0]-'a']=sterge(p->fii[cuv[0]-'a'],cuv+1);
    else
        p->nrc--;
    if(p->nrp==0)
    {
        delete p;
        p=NULL;
    }
    return p;
}

int app(Nod *p, char *cuv)
{
    if(p==NULL)
        return 0;

    if(cuv[0]==0)
        return p->nrc;

    return app(p->fii[cuv[0]-'a'],cuv+1);
}

int pref(Nod *p,char *cuv)
{
    if(*cuv==0 )
        return 0;
    if(p==NULL)
        return -1;
    return (1+pref(p->fii[cuv[0]-'a'],cuv+1));
}

int main()
{

    int t;
    char v[22];

    memset(v,0,sizeof v);

    Nod *start;

    start=new Nod;

    while(fscanf(in,"%d %s",&t,&v)>0)
    {
        if(t==0)
        {
            adauga(start,&v[0]);
        }
        else if(t==1)
        {
            sterge(start,&v[0]);
        }
        else if(t==2)
        {
            fprintf(out,"%d\n",app(start,&v[0]));
        }
        else
        {
            fprintf(out,"%d\n",pref(start,&v[0]));
        }
    }


    return 0;
}