Cod sursa(job #2153169)

Utilizator TudorVersoiuVersoiu Tudor Sorin TudorVersoiu Data 5 martie 2018 23:41:58
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.75 kb
#include <iostream>
#include <fstream>
#include <cstring>

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

struct t_node {
    int counter;
    char litera;

    t_node* fiu[29];
    t_node* parent;

    /// Functii nod
    t_node* getNext(char c) { return fiu[c-'a']; }
    void Init(char a) {
        for ( int i=0; i<29; i++ ) fiu[i] = NULL;
        parent = NULL;

        counter = 0;
        litera = a;
    }
    void Create(char c) {
        fiu[c-'a'] = new t_node;
        fiu[c-'a']->Init(c);
        fiu[c-'a']->parent = this;
    }
    int countChildren()
    {
        int result = 0;
        for ( int i=0; i<29; i++ )
            if ( fiu[i] != NULL )
                result++;
        return result;
    }
};

struct trie {
    t_node* root;

    trie() {
        root = new t_node;
        root->Init(-1);
        root->litera = -1;
    }
    void AddEntry(char w[25])
    {
        t_node* current = root;
        for ( int i=0; w[i]; i++ ) {
            t_node* next = current->getNext(w[i]);
            if ( next == NULL )
                current->Create(w[i]);

            current = current->getNext(w[i]);
        }
        current->counter++;
    }
    void RemoveEntry(char w[25])
    {
        t_node* current = root;
        for ( int i=0; w[i]; i++ ) {
            t_node* next = current->getNext(w[i]);
            current = current->getNext(w[i]);
        }
        current->counter--;
        while ( current->counter == 0 && current->countChildren() < 1 && current != root ) {
            t_node* next = current->parent;
            next->fiu[current->litera-'a'] = NULL;

            delete current;
            current = next;
        }
    }
    int CountWords(char w[25])
    {
        t_node* current = root;
        for ( int i=0; w[i]; i++ ) {
            t_node* next = current->getNext(w[i]);
            if ( next == NULL )
                return 0;

            current = current->getNext(w[i]);
        }
        return current->counter;
    }
    int LongestPrefix(char w[25])
    {
        int length = 0;
        t_node* current = root;
        for ( int i=0; w[i]; i++ ) {
            t_node* next = current->getNext(w[i]);
            if ( next == NULL ) break;
            current = current->getNext(w[i]);
            length++;
        }
        return length;
    }
};



int main()
{
    int x; char cuvant[25];
    trie dictionar;

    while ( f >> x >> cuvant ) {
        if ( x == 0 )      dictionar.AddEntry(cuvant);
        if ( x == 1 )      dictionar.RemoveEntry(cuvant);
        if ( x == 2 ) g << dictionar.CountWords(cuvant) << '\n';
        if ( x == 3 ) g << dictionar.LongestPrefix(cuvant) << '\n';
    }
}