Cod sursa(job #2841372)

Utilizator cdenisCovei Denis cdenis Data 29 ianuarie 2022 17:13:42
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

ifstream fin("trie.in");
ofstream fout("trie.out");

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++;
        return;
    }
    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(fin >> op >> cuv)
    {
        switch(op)
        {
            case 0: adauga(t,cuv); break;
            case 1: sterge(t,cuv); break;
            case 2: fout << numar_aparitii(t,cuv) << '\n'; break;
            case 3: fout << lungime_prefix_comun(t,cuv,0) << '\n'; break;
        }
    }
    return 0;
}