Cod sursa(job #3333846)

Utilizator rapidu36Victor Manz rapidu36 Data 15 ianuarie 2026 11:12:02
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.02 kb
#include <fstream>
#include <cstring>

using namespace std;

const int NL = 26;
const int NLC = 20;

struct nod
{
    int nr_pref, nr_cuv;
    nod* fiu[NL];

    nod()
    {
        nr_pref = nr_cuv = 0;
        for (int i = 0; i < NL; i++)
        {
            fiu[i] = NULL;
        }
    }
};

nod* adauga(nod* p, char cuv[])
{
    if (p == NULL)
    {
        p = new nod;
    }
    p->nr_pref++;
    if (cuv[0] == '\0')
    {
        p->nr_cuv++;
    }
    else
    {
        int poz_alfa = cuv[0]-'a';
        p->fiu[poz_alfa] = adauga(p->fiu[poz_alfa], cuv + 1);
    }
    return p;
}

nod* sterge(nod* p, char cuv[])
{
    p->nr_pref--;
    if (cuv[0] == '\0')
    {
        p->nr_cuv--;
    }
    else
    {
        int poz_alfa = cuv[0]-'a';
        p->fiu[poz_alfa] = sterge(p->fiu[poz_alfa], cuv + 1);
    }
    if (p->nr_pref == 0)
    {
        delete p;
        p = NULL;
    }
    return p;
}

int aparitii_cuv(nod* p, char cuv[])
{
    if (p == NULL)
    {
        return 0;
    }
    if (cuv[0] == '\0')
    {
        return p->nr_cuv;
    }
    int poz_alfa = cuv[0]-'a';
    return aparitii_cuv(p->fiu[poz_alfa], cuv + 1);
}

int lungime_prefix(nod* p, char cuv[])
{
    if (p == NULL)
    {
        return -1;
    }
    if (cuv[0] == '\0')
    {
        return 0;
    }
    int poz_alfa = cuv[0]-'a';
    return 1 + lungime_prefix(p->fiu[poz_alfa], cuv + 1);
}

int main()
{
    ifstream in("trie.in");
    ofstream out("trie.out");
    int tip;
    char cuv[NLC+1];
    nod* rad = NULL;
    while (in >> tip >> cuv)
    {
        if (tip == 0)
        {
            rad = adauga(rad, cuv);
        }
        else if (tip == 1)
        {
            rad = sterge(rad, cuv);
        }
        else if (tip == 2)
        {
            out << aparitii_cuv(rad, cuv) << "\n";
        }
        else
        {
            out << lungime_prefix(rad, cuv) << "\n";
        }
    }
    in.close();
    out.close();
    return 0;
}