Cod sursa(job #1211908)

Utilizator daniel.amarieiDaniel Amariei daniel.amariei Data 23 iulie 2014 14:36:31
Problema Trie Scor 45
Compilator cpp Status done
Runda Arhiva educationala Marime 2.31 kb
#include <fstream>
#include <string>
using namespace std;

ifstream ifs("trie.in");
ofstream ofs("trie.out");

typedef struct TrieNode
{
    int size; // The size of the subtree that starts from the current node
    int words; // The number of words that end at this node
    TrieNode* childs[32];
} TrieNode;


TrieNode* root; 


int get_char_index(char c)
{
    return c - 'a';
}

TrieNode* insert(TrieNode* node, string w, int l)
{
    if (node == NULL) node = new TrieNode;

    ++node->size;
    
    if (l == w.length()) 
    {
        ++node->words;
    } 
    else
    {
        int index = get_char_index(w[l]);
        node->childs[index] = insert(node->childs[index], w, l+1);
    }
    
    return node;
}

void insert(string w)
{
    root = insert(root, w, 0);
}

TrieNode* remove(TrieNode* node, string w, int l)
{
    if (node == NULL) return NULL;   
    
    --node->size;
    
    if (node->size == 0)
    {
        delete node;
        return NULL;
    }
    
    if (l == w.length()) 
    {
        --node->words;
    } 
    else
    {
        int index = get_char_index(w[l]);
        node->childs[index] = remove(node->childs[index], w, l+1);
    }
    
    return node;
}

void remove(string w)
{
    root = remove(root, w, 0);
}

int get_longest_prefix_length(TrieNode* node, string w, int l)
{
    if (node == NULL) return l-1;
    if (l == w.length()) return l;

    int index = get_char_index(w[l]);
    return get_longest_prefix_length(node->childs[index], w, l+1);
    
}

int get_number_of_occurences(TrieNode* node, string w, int l)
{
    if (node == 0) return 0;
    if (l == w.length()) return node->words;
    
    int index = get_char_index(w[l]);
    return get_number_of_occurences(node->childs[index], w, l+1);
}

int get_number_of_occurences(string w)
{
    return get_number_of_occurences(root, w, 0);
}

int get_longest_prefix_length(string w)
{
    return get_longest_prefix_length(root, w, 0);
}

int main()
{
    int op;
    string w;
    while (ifs >> op >> w)
    {
        if (op == 0)
        {
            insert(w);
        }
        else if (op == 1)
        {
            remove(w);
        } 
        else if (op == 2)
        {
            ofs << get_number_of_occurences(w) << "\n";
        }
        else if (op == 3)
        {
            ofs << get_longest_prefix_length(w) << "\n";
        }
    }   
}