Cod sursa(job #3257515)

Utilizator Radu_BicliBiclineru Radu Radu_Bicli Data 18 noiembrie 2024 08:50:03
Problema Trie Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.99 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--;
        if(nod->fr == 0) {
            nod->nrf--;
            if(nod->nrf <= 0 && nod != rad) {
                delete nod;
                return true;
            }
        }

        return false;
    }

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

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