Cod sursa(job #3004947)

Utilizator George_CristianGeorge Dan-Cristian George_Cristian Data 16 martie 2023 18:17:52
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <fstream>
#include <cstring>

using namespace std;

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

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

char cuv[25];
int nrl;

void adaugare(nod *&rad, int poz) {
    if (!rad)
        rad = new nod;
    rad->ap_pre++;
    if (poz == nrl)
        rad->ap_cuv++;
    else
        adaugare(rad->copii[cuv[poz] - 'a'], poz + 1);
}

void eliminare(nod *&rad, int poz) {
    rad->ap_pre--;
    if (poz == nrl)
        rad->ap_cuv--;
    else
        eliminare(rad->copii[cuv[poz] - 'a'], poz + 1);
}

int aparitii(nod *&rad, int poz) {
    if (!rad)
        return 0;
    if (poz == nrl)
        return rad->ap_cuv;
    return aparitii(rad->copii[cuv[poz] - 'a'], poz + 1);
}

int prefix(nod *&rad, int poz) {
    if (!rad || !rad->ap_pre)
        return poz - 1;
    if (poz == nrl)
        return nrl;
    return prefix(rad->copii[cuv[poz] - 'a'], poz + 1);
}

int main() {
    int tip;
    while (f >> tip >> cuv) {
        nrl = strlen(cuv);
        switch (tip) {
            case 0:
                adaugare(rad, 0);
                break;
            case 1:
                eliminare(rad, 0);
                break;
            case 2:
                g << aparitii(rad, 0) << '\n';
                break;
            case 3:
                g << prefix(rad, 0) << '\n';
                break;
        }
    }
    return 0;
}