Cod sursa(job #1146604)

Utilizator muresan_bogdanMuresan Bogdan muresan_bogdan Data 19 martie 2014 09:45:40
Problema Trie Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.67 kb
#include<iostream>
#include<fstream>
#include<cstring>
using namespace std;

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

struct vertex {
    short letter;
    int fii;
    int words;
    int pas;
    vertex *litera[26];
    vertex *tata;
};

short n;
string s;
vertex *origine;

void initialise(vertex* x) {
    x->letter = -1;
    x->fii = 0;
    x->words = 0;
    x->pas = 0;
    for(int i = 0; i < 26; i++) {
        x->litera[i] = NULL;
    }
    x->tata = NULL;
}

void addword(vertex* x, string word) {
    if(word == "") {
        x->words++;
    }else {
        short k = (short) word[0] - 97;
        if(x->litera[k] == NULL) {
            vertex *aux;
            aux = new vertex;
            initialise(aux);
            aux->pas = x->pas + 1;
            aux->tata = x;
            aux->letter = k;
            x->litera[k] = aux;
            x->fii++;
        }
        addword(x->litera[k], word.substr(1));
    }
}

vertex* Find(vertex* x, string word) {
    if(word != "") {
        short k = (short) word[0] - 97;
        if(x->litera[k] == NULL) {
            vertex *aux;
            aux = new vertex;
            aux->words = -1;
            aux->pas = x->pas;
            return aux;
        }else {
            return Find(x->litera[k], word.substr(1));
        }
    } else {
        return x;
    }
}

void delword(vertex* x, string word) {
    vertex *aux;
    aux = new vertex;
    aux = Find(x, word);
    int dist = aux->pas;
    aux->words--;
    vertex *tata;
    tata = new vertex;
    bool ok = 1;
    while(ok) {
        tata = aux->tata;
        if((aux->fii == 0) && (aux->words == 0)) {
            tata->litera[aux->letter] = NULL;
            delete aux;
            tata->fii--;
        }else {
            ok = 0;
        }
        aux = tata;
        if(aux == origine) {
            ok = 0;
        }
    }
}

int countword(vertex* x, string word) {
    if(word == "") {
        return x->words;
    }else {
        short k = (short) word[0] - 97;
        if(x->litera[k] != NULL) {
            return countword(x->litera[k], word.substr(1));
        }else {
            return 0;
        }
    }
}

int main() {
    origine = new vertex;
    initialise(origine);
    while(fin >> n) {
        fin >> s;
        if(n == 0) {
            addword(origine, s);
        }
        if(n == 1) {
            delword(origine, s);
        }
        if(n == 2) {
            fout << countword(origine, s) << '\n';
        }
        if(n == 3) {
            fout << Find(origine, s)->pas << '\n';
        }
    }
    fin.close();
    fout.close();
    return 0;
}