Cod sursa(job #1251572)

Utilizator Tudordmdaniel marin Tudordm Data 29 octombrie 2014 17:51:26
Problema Trie Scor 45
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include<cstdio>
#include<cstring>

using namespace std;

char s[22];

struct Nod{

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

    Nod(){

        nrp=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 aparitie(Nod *p, char *cuv)
{
    if(p==NULL)
        return 0;

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

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

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


int main(){


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

    int tip;

    Nod *p;
    p=new Nod;

    while(scanf("%d ",&tip)>0){

        gets(s);

    if(tip==0)

        adauga(p,&s[0]);

    else if(tip==1)

        sterge(p,&s[0]);

    else if(tip==2)

        printf("%d\n",aparitie(p,&s[0]));

    else printf("%d\n",lungpref(p,&s[0]));

    }

    return 0;

}