Cod sursa(job #3257516)

Utilizator Radu_BicliBiclineru Radu Radu_Bicli Data 18 noiembrie 2024 08:55:31
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.74 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("trie.in");
ofstream fout("trie.out");
const int carMax = 26;
struct Nod {
    Nod *fii[27];
    int nrf, fr;

    Nod() {
        nrf = fr = 0;
        for(int i = 0; i < carMax; i++) fii[i] = nullptr;
    }

    ~Nod() {
        for(int i = 0; i < carMax; i++) delete fii[i];
    }
} *rad;
char c[102];
int op, m;

static inline void Insert(char *p, int l, Nod *nod = rad) {
    if(l == 0) {
        nod->fr++;
        return;
    }

    int c = *p - 'a';
    if(nod->fii[c] == nullptr) {
        nod->fii[c] = new Nod();
        nod->nrf++;
    }

    Insert(p + 1, l - 1, nod->fii[c]);
}

static inline bool Delete(char *p, int l, Nod *nod = rad) {
    if(l == 0) nod->fr--;

    int c = *p - 'a';
    if(nod->fii[c] && Delete(p + 1, l - 1, nod->fii[c])) {
        nod->fii[c] = nullptr;
        nod->nrf--;
    }

    if(nod->fr == 0 && nod->nrf == 0 && nod != rad) {
        delete nod;
        return true;
    }
    return false;
}

static inline int Frecv(char *p, int l, Nod *nod = rad) {
    if(l == 0) return nod->fr;

    int c = *p - 'a';
    if(nod->fii[c] == nullptr) return 0;
    return Frecv(p + 1, l - 1, nod->fii[c]);
}

static inline int Lung(char *p, int l, int niv = 0, Nod *nod = rad) {
    if(l == 0) return niv;

    int c = *p - 'a';
    if(nod->fii[c] == nullptr) return niv;
    return Lung(p + 1, l - 1, niv + 1, nod->fii[c]);
}

int main() {
    rad = new Nod();

    while(fin >> op >> c) {
        m = strlen(c);

        if(op == 0) Insert(c, m);
        if(op == 1) Delete(c, m);
        if(op == 2) fout << Frecv(c, m) << "\n";
        if(op == 3) fout << Lung(c, m) << "\n";
    }

    return 0;
}