Cod sursa(job #1211996)

Utilizator daniel.amarieiDaniel Amariei daniel.amariei Data 23 iulie 2014 16:53:59
Problema Trie Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 2.36 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)
    {
        if (l < w.length())
        {        
            int index = get_char_index(w[l]);
            remove(node->childs[index], w, l+1);
        }

        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_number_of_occurences(string w)
{
    TrieNode * node = root;
    int l = 0;
    
    while (node != NULL) 
    {
        if (l == w.length()) return node->words;
        
        int index = get_char_index(w[l]);
        node = node->childs[index];
        ++l;
    }
   	
    return 0;
}

int get_longest_prefix_length(string w)
{
    TrieNode * node = root;
    int l = 0;
    
    while (node != NULL) 
    {
        if (l == w.length()) return l;
        
        int index = get_char_index(w[l]);
        node = node->childs[index];
        ++l;
    }
   	
    return l-1;
}

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";
        }
    }   
}