Cod sursa(job #1516278)

Utilizator diana97Diana Ghinea diana97 Data 2 noiembrie 2015 21:55:22
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int ALPHA = 26;
const int LMAX = 20;

struct Trie {
    int aparitii;
    int sfarsit_cuvant;
    Trie *fiu[ALPHA];

    Trie() {
        aparitii = 0;
        sfarsit_cuvant = 0;
        for (int i = 0; i < ALPHA; i++)
            fiu[i] = NULL;
    }
};

char s[LMAX];
Trie *radacina;

void init() {
    radacina = new Trie;
}

Trie *insereaza_cuvant(Trie *nod, char *s) {
    if (nod == NULL) nod = new Trie;

    nod->aparitii++;
    if (s[0] == 0) nod->sfarsit_cuvant++;
    else nod->fiu[s[0] - 'a'] = insereaza_cuvant(nod->fiu[s[0] - 'a'], s + 1);

    return nod;
}


Trie *sterge_cuvant(Trie *nod, char *s) {
    nod->aparitii--;

    if (s[0] == 0) nod->sfarsit_cuvant--;
    else nod->fiu[s[0] - 'a'] = sterge_cuvant(nod->fiu[s[0] - 'a'], s + 1);

    if (nod->aparitii == 0) {
        delete(nod);
        return NULL;
    }

    return nod;
}

int numar_aparitii(Trie *nod, char *s) {
    if (nod == NULL) return 0;

    if (s[0] == 0) return nod->sfarsit_cuvant;
    return numar_aparitii(nod->fiu[s[0] - 'a'], s + 1);
}

int prefix_maxim(Trie *nod, char *s) {
    if (nod == NULL) return -1;

    if (s[0] == 0) return 0;
    return 1 + prefix_maxim(nod->fiu[s[0] - 'a'], s + 1);
}

void rezolva() {
    int operatie;

    while (f >> operatie) {
        f >> s;
        //cout << s << endl;
        if (operatie == 0) radacina = insereaza_cuvant(radacina, s);
        else if (operatie == 1) radacina = sterge_cuvant(radacina, s);
        else if (operatie == 2) g << numar_aparitii(radacina, s) << '\n';
        else g << prefix_maxim(radacina, s) << '\n';
    }
}

int main() {
    init();
    rezolva();

    return 0;
}