Cod sursa(job #3255493)

Utilizator Mihai_OctMihai Octavian Mihai_Oct Data 10 noiembrie 2024 18:58:11
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.95 kb
#include <bits/stdc++.h>

using namespace std;

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

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

    ~Trie() {
        for(int i = 0; i <= carMax; i++) delete fii[i];
    }
};
Trie *radTrie;

static inline void Insert(Trie *nod, const string &val, int idx = 0) {
    if(idx == val.size()) {
        nod->fr++;
        return;
    }

    int cur = val[idx] - 'a';
    if(nod->fii[cur] == nullptr) {
        nod->fii[cur] = new Trie();
        nod->nrf++;
    }

    Insert(nod->fii[cur], val, idx + 1);
}

static inline bool Delete(Trie *nod, const string &val, int idx = 0) {
    int cur = val[idx] - 'a';

    if(idx == val.size()) nod->fr--;
    else if(Delete(nod->fii[cur], val, idx + 1)) {
        nod->fii[cur] = nullptr;
        nod->nrf--;
    }

    if(nod->fr == 0 && nod->nrf == 0 && nod != radTrie) {
        delete nod;
        return 1;
    }

    return 0;
}

static inline int GetFr(Trie *nod, const string &val, int idx = 0) {
    int cur = val[idx] - 'a';

    if(idx == val.size()) return nod->fr;
    else if(nod->fii[cur] == nullptr) return 0;
    return GetFr(nod->fii[cur], val, idx + 1);
}

static inline int GetLung(Trie *nod, const string &val, int idx = 0) {
    int cur = val[idx] - 'a';

    if(idx == val.size()) return idx;
    else if(nod->fii[cur] == nullptr) return idx;
    return GetLung(nod->fii[cur], val, idx + 1);
}

int main() {
    int op;
    string s;

    radTrie = new Trie();
    while(fin >> op >> s) {
        if(op == 0)      Insert(radTrie, s);
        else if(op == 1) Delete(radTrie, s);
        else if(op == 2) fout << GetFr(radTrie, s)   << "\n";
        else             fout << GetLung(radTrie, s) << "\n";
    }

    delete radTrie;

    return 0;
}