Cod sursa(job #2845354)

Utilizator francescom_481francesco martinut francescom_481 Data 7 februarie 2022 18:57:13
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <bits/stdc++.h>

using namespace std;



    ifstream fin("trie.in");
    ofstream fout("trie.out");
    #define cin fin
    #define cout fout


int op;
char cuv[25];

struct Trie
{
    int cnt,nrfii;
    Trie *fiu[26];
    Trie()
    {
        cnt=nrfii=0;
        for(int i=0; i<26; i++)
            fiu[i]=0;
    }
};

Trie *t=new Trie;

void adauga(Trie *nod, char *s)
{
    if(*s=='\0')
    {
        nod->cnt++;

    }
    else
    {
        if(nod->fiu[*s-'a']==0)
        {
            nod->fiu[*s-'a']=new Trie;
            nod->nrfii++;
        }
        adauga(nod->fiu[*s-'a'],s+1);
    }
}

int sterge(Trie *nod, char *s)
{
    if(*s=='\0')
        nod->cnt--;
    else if(sterge(nod->fiu[*s-'a'],s+1))
    {
        nod->fiu[*s-'a']=0;
        nod->nrfii--;
    }
    if(nod->cnt==0 && nod->nrfii==0 && nod!=t)
    {
        delete nod;
        return 1;
    }
    return 0;
}

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

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

int main ()
{
    while(cin >> op >> cuv)
    {
        if(op == 0)
        {
            adauga(t,cuv);
        }
        if(op == 1)
        {
            sterge(t,cuv);
        }
        if(op == 2)
        {
            cout << numar_aparitii(t,cuv) << '\n';
        }
        if(op == 3)
        {
            cout << lungime_prefix_comun(t,cuv,0) << '\n';
        }
    }
    return 0;
}