Cod sursa(job #1458044)

Utilizator CollermanAndrei Amariei Collerman Data 6 iulie 2015 11:33:46
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <fstream>
#include <cstring>
using namespace std;
ofstream fout("trie.out");
ifstream fin("trie.in");

struct Trie
{
    int cuvinte;
    int prefixe;
    Trie *fii[26];

    Trie() {
        cuvinte = prefixe = 0;
        memset(fii, 0, sizeof(fii));
    }
};

Trie *t = new Trie();

void inserare(char * cuv, Trie * nod)
{
    nod -> prefixe++;

    if(*cuv == 0) {
        nod -> cuvinte++;
        return;
    }

    if(nod -> fii[*cuv - 'a'] == 0)
        nod -> fii[*cuv - 'a'] = new Trie();

    inserare(cuv + 1, nod -> fii[*cuv - 'a']);
}

void stergere(char * cuv, Trie * nod)
{
    nod -> prefixe--;

    if(*cuv == 0) {
        nod -> cuvinte--;
        return;
    }

    stergere(cuv + 1, nod -> fii[*cuv - 'a']);
}

int aparitii(char * cuv, Trie * nod)
{
    if(*cuv == 0) return nod -> cuvinte;

    if(nod -> fii[*cuv - 'a'] == 0) return 0;

    return aparitii(cuv + 1, nod -> fii[*cuv - 'a']);
}

int lungime_prefix(char * cuv, Trie * nod)
{
    if(nod -> prefixe == 0) return 0;

    if(*cuv == 0) return 1;

    if(nod -> fii[*cuv - 'a'] == 0) return 1;

    return 1 + lungime_prefix(cuv + 1, nod -> fii[*cuv - 'a']);
}

int main()
{
    char cuvant[26];
    int op = 0;

    while(fin >> op) {
        fin >> cuvant;
        switch (op)
        {
            case 0: inserare(cuvant, t); break;
            case 1: stergere(cuvant, t); break;
            case 2: fout << aparitii(cuvant, t) << '\n'; break;
            case 3: fout << max(lungime_prefix(cuvant, t) - 1, 0) << '\n'; break;
        }
    }

    return 0;
}