Cod sursa(job #2628158)

Utilizator al3xionescuIonescu Alexandru al3xionescu Data 14 iunie 2020 18:15:04
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.8 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie {
    int nr_cuvinte, nr_fii;
    Trie *fiu[26];
    Trie() {
        nr_cuvinte = nr_fii = 0;
        memset(fiu, 0, sizeof(fiu));
    }
};
Trie *T = new Trie;
string s;
void ins(Trie *nod, int pos) {
    if (pos == s.size()) {
        nod -> nr_cuvinte++;
        return;
    }
    if (nod -> fiu[s[pos] - 'a'] == 0) {
        nod -> fiu[s[pos] - 'a'] = new Trie;
        nod -> nr_fii++;
    }
    ins(nod -> fiu[s[pos] - 'a'], pos + 1);
}
int del(Trie *nod, int pos) {
    if (pos == s.size()) {
        nod -> nr_cuvinte--;
    }
    else 
        if (del(nod -> fiu[s[pos] - 'a'], pos + 1)) {
            nod -> nr_fii--;
            nod -> fiu[s[pos] - 'a'] = 0;
        }
        if (nod -> nr_fii == 0 && nod -> nr_cuvinte == 0 && nod != T) {
            delete nod;
            return 1;
        }
        return 0;
}
int ans(Trie *nod, int pos) {
    if (pos == s.size()) {
        return nod -> nr_cuvinte;
    }
    if (nod -> fiu[s[pos] - 'a'] == 0) {
        return 0;
    }
    return ans(nod -> fiu[s[pos] - 'a'], pos + 1);
}
int pref(Trie *nod, int pos, int len) {
    if (pos == s.size() || nod -> fiu[s[pos] - 'a'] == 0) {
        return len;
    }
    return pref(nod -> fiu[s[pos] - 'a'], pos + 1, len + 1);
}
int main() {
    int operation;
    while (fin >> operation >> s) {
        switch(operation) {
            case 0:
              ins(T, 0);
              break;
            case 1:
              del(T, 0);
              break;
            case 2:
              fout << ans(T, 0) << "\n";
              break;
            case 3:
              fout << pref(T, 0, 0) << "\n";
              break;
         }
    }
    return 0;
}