Cod sursa(job #2075108)

Utilizator dago28Stoican Dragos dago28 Data 25 noiembrie 2017 11:24:57
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;


struct Trie
{
    int sf=0,nrfii=0;
    Trie *fiu[26];
    Trie()
    {
        memset( fiu, 0, sizeof( fiu ) );
    }
};


Trie *T = new Trie;


void Adaugare (Trie *nod, char *s)
{
    if (*s=='\n')
    {
        nod->sf++;
        return;
    }
    if (nod->fiu[*s-'a']==0)
    {
        nod->fiu[*s-'a'] = new Trie;
        nod->nrfii++;
    }

    Adaugare(nod->fiu[*s-'a'],s+1);
}


bool Stergere (Trie *nod, char *s)
{
    if (*s=='\n')
    {
        nod->sf--;
    }
    else if (Stergere(nod->fiu[*s-'a'],s+1))
    {
        nod->fiu[*s-'a']=0;
        nod->nrfii--;
    }
    if (nod!=T && nod->nrfii==0 && nod->sf==0)
    {
        delete nod;
        return 1;
    }
    return 0;
}


int NrApp(Trie *nod,char *s)
{
    if (*s=='\n')
        return nod->sf;
    if (nod->fiu[*s-'a'])
        return NrApp(nod->fiu[*s-'a'],s+1);
    return 0;
}


int Prefix (Trie *nod, char *s, int depth=0)
{
    if (*s=='\n' || nod->fiu[*s-'a']==0)
        return depth;
    return Prefix(nod->fiu[*s-'a'],s+1,depth+1);
}


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


    int op;
    char a[50];

    while(1)
    {
        fgets(a,50,stdin);
        if (a[0]=='\n')
            break;
        if (a[0]=='0')
        {
            Adaugare(T,a+2);
        }
        if (a[0]=='1')
        {
            Stergere(T,a+2);
        }
        if (a[0]=='2')
        {
            cout<<NrApp(T,a+2)<<endl;
        }
        if (a[0]=='3')
        {
            cout<<Prefix(T,a+2)<<endl;
        }
    }
    return 0;
}