Cod sursa(job #2398725)

Utilizator CezarTDTodirisca Cezar CezarTD Data 5 aprilie 2019 23:18:14
Problema Trie Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.18 kb
#include <cstring>

#include <iostream>

#define ch (*s-'a')



using namespace std;

struct Trie

{

    int nrfii;

    int cnt;

    Trie *fii[26];

    Trie()

    {

        cnt=0;

        nrfii=0;

        memset(fii,0,sizeof(fii));

    }

};



Trie *T = new Trie;

void ins(Trie *nod,char *s)

{

    if(*s=='\n')

    {

        nod->cnt++;

        return ;

    }

    if(nod->fii[ch]==0)

    {

        nod->fii[ch]= new Trie;

        nod->nrfii++;

    }

    ins(nod->fii[ch],s+1);

}



int del(Trie *nod,char *s)

{

    if(*s=='\n')

        nod->cnt--;

    else

    {

        if(del(nod->fii[ch],s+1))

        {

            nod->fii[ch]=0;

            nod->nrfii--;

        }

    }

    if(nod->cnt==0 && nod->nrfii==0 && nod!=T)

    {

        delete nod;

        return 1;

    }

    return 0;

}



int apar(Trie *nod,char *s)

{

    if(*s=='\n')

        return nod->cnt;

    if(nod->fii[ch])

        return apar(nod->fii[ch],s+1);

    return 0;

}



int pre(Trie *nod,char *s,int k)

{

    if(*s=='\n' || nod->fii[ch]==0)

        return k;

    return pre(nod->fii[ch],s+1,k+1);

}



int main()

{

    freopen("trie.in","r",stdin);

    freopen("trie.out","w",stdout);

    char linie[25];

    fgets(linie,25,stdin);

    while(!feof(stdin))

    {

        switch(linie[0])

        {

        case '0':

            ins(T,linie+2);

            break;

        case '1':

            del(T,linie+2);

            break;

        case '2':

        {

            int i=0,c=strlen(linie+2);

            Trie *r= new Trie;

            r=T;

            for(i=0;i<c-1;i++)

            {

                if(!r->fii[int(linie[i+2]-'a')])break;

                r=r->fii[int(linie[i+2]-'a')];

            }

            if(i<c-1)printf("0\n");

            else printf("%d\n",r->cnt);

            break;

        }

        case '3':

            printf("%d\n",pre(T,linie+2,0));

            break;

        }

        fgets(linie,25,stdin);

    }

    return 0;

}