Cod sursa(job #2748516)

Utilizator toma_ariciuAriciu Toma toma_ariciu Data 1 mai 2021 11:06:55
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.69 kb
#include <fstream>

using namespace std;

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

struct Trie {
    int nr, nrCuv;
    Trie *lit[26];
    Trie() {
        nr = nrCuv = 0;
        for (int i = 0; i < 26; i++)
            lit[i] = 0;
    }
};

Trie* root = new Trie();

void Insert(Trie* Nod, char *s) {
    if (*s == 0)
        Nod->nrCuv++;
    else {
        int ind = *s - 'a';
        if (Nod->lit[ind] == 0) {
            Nod->lit[ind] = new Trie();
            Nod->nr++;
        }
        Insert(Nod->lit[ind], s + 1);
    }
}

bool Delete(Trie *nod, char *s) {
    if (*s == 0)
        nod->nrCuv--;
    else {
        int ind = *s - 'a';
        if (Delete(nod->lit[ind], s + 1)) {
            nod->lit[ind] = NULL;
            nod->nr--;
        }
    }
    if (nod->nrCuv == 0 && nod->nr == 0 && nod != root) {
        delete nod;
        return 1;
    }
    return 0;
}

int Search(Trie *Nod, char *s) {
    if (*s == 0)
        return Nod->nrCuv;
    else {
        int ind = *s - 'a';
        if (Nod->lit[ind])
            return Search(Nod->lit[ind], s + 1);
    }
    return 0;
}

int LCP(Trie *Nod, char *s, int nr) {
    if (*s == 0)
        return nr;
    int ind = *s - 'a';
    if (Nod->lit[ind] == 0)
        return nr;
    return LCP(Nod->lit[ind], s + 1, nr + 1);
}

char s[21];

void solve() {
    int op;
    while (fin >> op >> s) {
        if (op == 0)
            Insert(root, s);
        else if (op == 1)
            Delete(root, s);
        else if (op == 2)
            fout<< Search(root, s) << '\n';
        else fout<< LCP(root, s, 0) << '\n';
    }
}

int main() {
    solve();
    return 0;
}