Cod sursa(job #3144198)

Utilizator Mihai_PopescuMihai Popescu Mihai_Popescu Data 5 august 2023 22:35:57
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <fstream>
#include <cstring>
using namespace std;

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

struct nod {
    int nrAp, pr;
    nod *next[27];

    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;
}