Cod sursa(job #2870176)

Utilizator George_CristianGeorge Dan-Cristian George_Cristian Data 12 martie 2022 10:28:32
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <fstream>
#include <cstring>

using namespace std;

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

#define SIRMAX 25

struct nod_trie {
    int ap_pre = 0;
    int ap_cuv = 0;
    nod_trie *copii[26];
} *rad;

char sir[SIRMAX];
int nrlsir;

void adaugare(nod_trie *&nod, int pozcur) {
    if (nod == nullptr)
        nod = new nod_trie;
    nod->ap_pre++;
    if (pozcur == nrlsir)
        nod->ap_cuv++;
    else
        adaugare(nod->copii[sir[pozcur] - 'a'], pozcur + 1);
}

void eliminare(nod_trie *&nod, int pozcur) {
    nod->ap_pre--;
    if (pozcur == nrlsir)
        nod->ap_cuv--;
    else
        eliminare(nod->copii[sir[pozcur] - 'a'], pozcur + 1);
}

int aparitii_cuv(nod_trie *&nod, int pozcur) {
    if (nod == nullptr || nod->ap_pre == 0)
        return 0;
    if (pozcur == nrlsir)
        return nod->ap_cuv;
    return aparitii_cuv(nod->copii[sir[pozcur] - 'a'], pozcur + 1);
}

int lungime_prefix(nod_trie *&nod, int pozcur) {
    if (nod == nullptr || nod->ap_pre == 0)
        return pozcur - 1;
    if (pozcur == nrlsir)
        return nrlsir;
    return lungime_prefix(nod->copii[sir[pozcur] - 'a'], pozcur + 1);
}

int main() {
    int cer;
    while (f >> cer >> sir) {
        nrlsir = strlen(sir);
        if (cer == 0)
            adaugare(rad, 0);
        else if (cer == 1)
            eliminare(rad, 0);
        else if (cer == 2)
            g << aparitii_cuv(rad, 0) << '\n';
        else if (cer == 3)
            g << lungime_prefix(rad, 0) << '\n';
    }
    return 0;
}