Cod sursa(job #3139047)

Utilizator stanciu_anaStanciu Ana-Maria stanciu_ana Data 24 iunie 2023 14:35:20
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.1 kb
#include <fstream>
#include <cstring>

using namespace std;

ifstream cin("test.in");
ofstream cout("test.out");

struct Nod
{
    int val_rep, val;
    Nod *urm[40];
    Nod()
    {
        val = 0;
        val_rep = 0;
        for(int i = 0; i <= 36; i++)
            urm[i] = NULL;
    }
}*start;

int x, q;
char sir[40];
Nod *poz;

void adauga()
{
    for(int i = 0; i < q; i++)
    {
        int poz_lit = sir[i] - 'a';
        if(poz->urm[poz_lit] == NULL)
            poz->urm[poz_lit] = new Nod;
        poz = poz->urm[poz_lit];
        poz->val_rep++;
    }
    poz->val++;
}

void sterge()
{
    for(int i = 0; i < q; i++)
    {
        int poz_lit = sir[i] - 'a';
        poz = poz->urm[poz_lit];
        poz->val_rep--;
    }
    poz->val--;
    if(poz->val < 0)
    {
        cout << "@@@@@@@@@@@@@@@ERROR@@@@@@@@@@";
        return;
    }
}

void print_aparitii()
{
    int ok = 1;
    for(int i = 0; i < q && ok; i++)
    {
        int poz_lit = sir[i] - 'a';
        if(poz->urm[poz_lit] == NULL)
            ok = 0;
        else
            poz = poz->urm[poz_lit];

    }
    if(ok == 1 && poz->val > 0)
        cout << poz->val<<'\n';
    else
        cout << '0'<<'\n';
}

void print_prefix_comun()
{
    int cnt = 0;
    int ok = 1;
    for(int i = 0; i < q&&ok; i++)
    {
        int poz_lit = sir[i] - 'a';
        if(poz->urm[poz_lit] == NULL || poz->urm[poz_lit]->val_rep < 1)
            ok = 0;
        else
            poz = poz->urm[poz_lit], cnt++;
    }
    cout << cnt << '\n';
}

int main()
{
    start = new Nod;
    start->val_rep = 100000000;
    while(cin >> x >> sir)
    {
        q = strlen(sir);
        poz = start;
        if(x == 0)
        {
            adauga();
            continue;
        }
        if(x == 1)
        {
            sterge();
            continue;
        }
        if(x == 2)
        {
            print_aparitii();
            continue;
        }
        if(x == 3)
        {
            print_prefix_comun();
            continue;
        }
    }

    return 0;
}