Cod sursa(job #3292322)

Utilizator Andercau_VasileAndercau Vasile Andercau_Vasile Data 7 aprilie 2025 21:16:56
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.65 kb
#include <fstream>
#include <cstring>
using namespace std;

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

struct nod {
    int nrAp, pr;    // nrAp = numarul de aparitii a cuvantului pana la nod
    nod *next[27];   // pr = numarul de cuvinte care il au pe nod ca prefix

    nod() {
        pr = nrAp = 0;
        memset(next, 0, sizeof(next));
    }
} *T;

char s[25];
int n;

void adaug() {
    nod *q = T;
    q->pr++;
    for (int i = 0; i < n; ++i) {
        if (q->next[s[i]] == 0) {
            q->next[s[i]] = new nod;
        }
        q = q->next[s[i]];
        q->pr++;
    }
    q->nrAp++;
}

void del() {
    nod *q = T;
    q->pr--;
    for (int i = 0; i < n; ++i) {
        q = q->next[s[i]];
        q->pr--;
    }
    q->nrAp--;
}

int prefix() {
    nod *q = T;
    for (int i = 0; i < n; ++i) {
        if (q->next[s[i]] == 0 || q->next[s[i]]->pr == 0) {
            return i;
        }
        q = q->next[s[i]];
    }
    return n;
}

int cuv() {
    nod *q = T;
    for (int i = 0; i < n; ++i) {
        if (q->next[s[i]] == 0) {
            return 0;
        }
        q = q->next[s[i]];
    }
    return q->nrAp;
}

int main() {
    T = new nod;
    int op;
    while (fin >> op) {
        fin.get();
        fin.getline(s, 25);
        n = strlen(s);
        for (int i = 0; i < n; ++i) {
            s[i] -= 'a';
        }
        if (op == 0) {
            adaug();
        } else if (op == 1) {
            del();
        } else if (op == 2) {
            fout << cuv() << '\n';
        } else {
            fout << prefix() << '\n';
        }
    }
    return 0;
}