Cod sursa(job #1376905)

Utilizator oprea1si2si3Oprea Sebastian oprea1si2si3 Data 5 martie 2015 19:22:28
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#include <fstream>
using namespace std;

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

const int kLMax = 30;

struct noduri {
    int ap, nr;
    noduri *fii[kLMax];
    noduri() {
        ap = 0; nr = 0;
        for (int i = 0; i <= kLMax; ++i)
            fii[i] = 0;
    }
};
noduri *trie=new noduri;


void AdaugareNod(noduri *nod, char *cuvant) {
    if (cuvant[0] == 0) {
        nod->ap++;
        return;
    }
    if (!nod->fii[cuvant[0] - 'a']) {
        nod->fii[cuvant[0] - 'a'] = new noduri;
        nod->nr++;
    }
    AdaugareNod(nod->fii[cuvant[0] - 'a'], cuvant + 1);
}

int StergereNod(noduri *nod, char *cuvant) {
    if (cuvant[0] == 0)
        nod->ap--;
    else if (StergereNod(nod->fii[cuvant[0] - 'a'], cuvant + 1)) {
        nod->nr--;
        nod->fii[cuvant[0] - 'a'] = 0;
    }
    if (nod != trie && nod->nr == 0 && nod->ap == 0) {
        delete nod;
        return 1;
    }
    return 0;
}

int AparitiiNod(noduri *nod, char *cuvant) {
    if (cuvant[0] == 0)
        return nod -> ap;
    if (nod->fii[cuvant[0] - 'a'] == 0)
        return 0;
    AparitiiNod(nod->fii[cuvant[0] - 'a'], cuvant + 1);
}

int Cmlpc(noduri *nod, char *cuvant) {
    if (cuvant[0] == 0 || nod->fii[cuvant[0] - 'a'] == 0)
        return 0;
    return (Cmlpc(nod->fii[cuvant[0] - 'a'], cuvant + 1) + 1);
}

int main() {
    int tip;
    char cuvant[kLMax];
    while (in >> tip >> cuvant) {
        if (tip == 0)
            AdaugareNod(trie, cuvant);
        if (tip == 1)
            StergereNod(trie, cuvant);
        if (tip == 2)
            out << AparitiiNod(trie, cuvant) << '\n';
        if (tip == 3)
            out << Cmlpc(trie, cuvant) << '\n';
    }
    in.close();
    out.close();
    return 0;
}