Cod sursa(job #2403709)

Utilizator CezarTDTodirisca Cezar CezarTD Data 11 aprilie 2019 19:49:53
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.73 kb
#include <bits/stdc++.h>

#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;
        nod=nullptr;
        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[30];

    fgets(linie,25,stdin);

    while(!feof(stdin))

    {

        strcat(linie,"\n");

        switch(linie[0])

        {

            case '0':ins(T,linie+2);break;

            case '1':del(T,linie+2);break;

            case '2':printf("%d\n",apar(T,linie+2));;break;

            case '3':printf("%d\n",pre(T,linie+2,0));break;

        }

        fgets(linie,32,stdin);

    }

    return 0;

}