Cod sursa(job #2909003)

Utilizator mihneazzzMacovei Daniel mihneazzz Data 7 iunie 2022 20:19:49
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie
{
    int cnt,nrfii;
    Trie *fiu[26];
    Trie()
    {
        cnt=nrfii=0;
        memset(fiu,0,sizeof(fiu));
    }
};
Trie *T=new Trie;
void Adaugare(Trie *nod,char *s)
{
    if(*s==NULL) {nod->cnt++;return;}
    if(!nod->fiu[*s-'a'])
    {
        nod->fiu[*s-'a']=new Trie;
        nod->nrfii++;
    }
    Adaugare(nod->fiu[*s-'a'],s+1);
}
bool Stergere(Trie *nod,char *s)
{
    if(*s==NULL) nod->cnt--;
    else if(Stergere(nod->fiu[*s-'a'],s+1))
        nod->fiu[*s-'a']=0,nod->nrfii--;
    if(!nod->cnt && !nod->nrfii && nod!=T)
    {
        delete nod;
        return 1;
    }
    return 0;
}
int NrAparitii(Trie *nod,char *s)
{
    if(*s==NULL) return nod->cnt;
    if(nod->fiu[*s-'a'])return NrAparitii(nod->fiu[*s-'a'],s+1);
    return 0;
}
int Prefix(Trie *nod,char *s,int nivel)
{
    if(*s==NULL || !nod->fiu[*s-'a']) return nivel;
    else return Prefix(nod->fiu[*s-'a'],s+1,nivel+1);
}
int main()
{
    int op;
    char s[30];
    while(fin>>op>>s)
        switch (op)
    {
        case 0:Adaugare(T,s);break;
        case 1:Stergere(T,s);break;
        case 2:fout<<NrAparitii(T,s)<<"\n";break;
        case 3:fout<<Prefix(T,s,0)<<"\n";break;
    }

    return 0;
}