Cod sursa(job #1255923)

Utilizator diana97Diana Ghinea diana97 Data 5 noiembrie 2014 16:18:35
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int LMAX = 26;
char s[LMAX];

struct trie {
    int aparitii, nrcuv;
    trie *fii[LMAX];
    trie() {
        aparitii = 0;
        nrcuv = 0;
        for (int i = 0; i < LMAX; i++) fii[i] = NULL;
    };
};

trie *radacina;

trie *adauga(trie *p, char *s) {
    if (p == NULL) p = new trie;
    p->aparitii++;
    if (s[0] == 0) p->nrcuv++;
    else p->fii[s[0] - 'a'] = adauga(p->fii[s[0] - 'a'], s + 1);
    return p;
}

trie *sterge(trie *p, char *s) {
    p->aparitii--;
    if(s[0] == 0) p->nrcuv--;
    else p->fii[s[0] - 'a'] = sterge(p->fii[s[0] - 'a'], s + 1);
    if(p->aparitii == 0) {
        delete(p);
        return NULL;
    }
    return p;
}

int aparitii(trie *p, char *s) {
    if (p == NULL) return 0;
    if (s[0] == 0) return p->nrcuv;
    return aparitii(p->fii[s[0] - 'a'], s + 1);
}

int prefix(trie *p, char *s) {
    if (p == NULL) return -1;
    if (s[0] == 0) return 0;
    return 1 + prefix(p->fii[s[0] - 'a'], s + 1);
}


void rezolva() {
    int t;
    radacina = new trie;
    while (f >> t) {
        f >> s;
        if (t == 0) radacina = adauga(radacina, s);
        else if (t == 1) radacina = sterge(radacina, s);
        else if (t == 2) g << aparitii(radacina, s) << '\n';
        else g << prefix(radacina, s) << '\n';
    }
}

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