Cod sursa(job #2949128)

Utilizator Zed1YasuoAlex Birsan Zed1Yasuo Data 29 noiembrie 2022 22:15:27
Problema Trie Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.68 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
int t;
char a[30];
struct  Trie
{
    int NrFii,Val;
    Trie *fiu[27];
    Trie()
    {
        NrFii=Val=0;
        for(int y=0; y<
        27; y++)
            fiu[y]=0;
    }
};
Trie *T= new Trie;
void add(Trie *nod, char *a)
{
    if(!isalpha(*a))
    {
        nod->Val++;
        return;
    }
    int copil=*a-'a';
    if(!nod->fiu[copil])
    {
        nod->NrFii++;
        nod->fiu[copil]=new Trie;
    }
    add(nod->fiu[copil],a+1);
}
bool stergere(Trie *nod, char *a)
{
    if(!isalpha(*a))
        nod->Val--;
    else
    {
        int copil=*a-'a';
        if(stergere(nod->fiu[copil],a+1))
        {
            nod->NrFii--;
            nod->fiu[copil]=0;
        }
    }
    if(nod->NrFii==0&& nod->Val==0&& nod!=T)
    {
        delete nod;
        return 1;
    }
    else
        return 0;
}
void prefix(Trie *nod, char *a,int lungime)
{
    if(!isalpha(*a)||!(nod->fiu[*a-'a']))
    {

        g<<lungime<<'\n';
        return;
    }
    else
    {

        prefix(nod->fiu[*a-'a'],a+1,lungime+1);
    }
}
void cautare(Trie *nod, char *a)
{
    if(!isalpha(*a))
    {
        g<<nod->Val<<'\n';
        return;
    }
    int copil=*a-'a';
    if(!nod->fiu[copil])
        g<<nod->Val<<'\n';
    else
        cautare(nod->fiu[copil],a+1);
}
int main()
{
    while(f>>t>>a)
    {
        if(t==0)
            add(T,a);
        else
        if(t==2)
            cautare(T,a);
        else
        if(t==1)
            stergere(T,a);
        else
            prefix(T,a,0);
    }
    return 0;
}