Cod sursa(job #3281772)

Utilizator PsyDuck1914Feraru Rares-Serban PsyDuck1914 Data 3 martie 2025 16:32:51
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.3 kb
#include <fstream>

using namespace std;

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

const int NL = 26;
const int LC = 20;

struct nod
{
    nod* fii[NL];
    int nr_cuvinte;
    nod()
    {
        nr_cuvinte = 0;
        for (int i = 0; i < NL; i++)
        {
            fii[i] = NULL;
        }
    }
};

bool este_frunza(nod* p)
{
    for (int i = 0; i < NL; i++)
    {
        if (p->fii[i] != NULL)
        {
            return false;
        }
    }
    return true;
}

nod* adauga(nod* p, char cuv[])
{
    if (p == NULL)
    {
        p = new nod;
    }
    if (cuv[0] == '\0')///suntem la finalul cuvantului pe care-l adaugam
    {
        p->nr_cuvinte++;
    }
    else
    {
        int poz_litera = (int)(cuv[0] - 'a');
        p->fii[poz_litera] = adauga(p->fii[poz_litera], cuv + 1);
    }
    return p;
}

nod* sterge(nod* p, char cuv[])
{
    if (cuv[0] == '\0')
    {
        p->nr_cuvinte--;
    }
    else
    {
        int poz_litera = (int)(cuv[0] - 'a');
        p->fii[poz_litera] = sterge(p->fii[poz_litera], cuv + 1);
    }
    if (este_frunza(p) && p->nr_cuvinte == 0)///p este o frunza
    {
        delete p;
        p = NULL;
    }
    return p;
}

int aparitii(nod* p, char cuv[])
{
    if (cuv[0] == '\0')///suntem la finalul cuvantului verificat
    {
        return p->nr_cuvinte;
    }
    int poz_litera = (int)(cuv[0] - 'a');
    if (p->fii[poz_litera] != NULL)
    {
        return aparitii(p->fii[poz_litera], cuv + 1);
    }
    return 0;
}

int lung_prefix(nod* p, char cuv[])
{
    if (p == NULL || cuv[0] == '\0')///suntem la finalul cuvantului verificat
    {
        return 0;
    }
    int poz_litera = (int)(cuv[0] - 'a');
    if (p->fii[poz_litera] == NULL)
    {
        return 0;
    }
    return 1 + lung_prefix(p->fii[poz_litera], cuv + 1);
}

int main()
{
    
    char cuvant[LC+1];
    int tip;
    nod *radacina = NULL;
    
    while (in >> tip >> cuvant)
    {
        if (tip == 0)
        {
            radacina = adauga(radacina, cuvant);
        }
        else if (tip == 1)
        {
            radacina = sterge(radacina, cuvant);
        }
        else if (tip == 2)
        {
            out << aparitii(radacina, cuvant) << "\n";
        }
        else///tip == 3
        {
            out << lung_prefix(radacina, cuvant) << "\n";
        }
    }
    
    
    return 0;
}