Cod sursa(job #1162872)

Utilizator rockerboyHutter Vince rockerboy Data 1 aprilie 2014 00:23:29
Problema Trie Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2.02 kb
#include <fstream>
#include <string>
#include <cstring>
#include <stack>

#define IN 0
#define OUT 1
#define FREC 2
#define MAXPREF 3

using namespace std;

class trie
{
private:                ///=== private ===///
    struct node
    {
        int endword, nr;
        node *next[26];
        node()
        {
            endword = 0;
            nr = 0;
            memset(next, 0, 104);
        }
    };
    node *Root, *Temp;
public:                 ///=== public  ===///
    trie()
    {
        Root = new node;
    }
    void add (const string& s)
    {
        Temp = Root;
        for (int i=0; i<s.length(); i++)
        {
            if (!Temp->next[s[i]-'a']) Temp->next[s[i]-'a'] = new node;
            Temp = Temp->next[s[i]-'a'];
            Temp->nr++;
        }
        Temp->endword++;
    }
    void eliminate (const string& s)
    {
        Temp = Root;
        for (int i=0; i<s.length(); i++)
        {
            Temp = Temp->next[s[i]-'a'];
            Temp->nr--;
        }
        Temp->endword --;
    }
    int get_frec(const string& s)
    {
        Temp = Root;
        for (int i=0; i<s.length(); i++)
        {
            if (!Temp->next[s[i]-'a']) return 0;
            Temp = Temp->next[s[i]-'a'];
        }
        return Temp->endword;
    }
    int get_prefix_length(const string& s)
    {
        Temp = Root;
        int len=0;
        while (Temp->next[s[len]-'a'] && Temp->next[s[len]-'a']->nr)
        {
            Temp = Temp->next[s[len]-'a'];
            len++;
        }
        return len;
    }
};

ifstream f("trie.in");
ofstream g("trie.out");
string current;
int type;
trie Words;

int main()
{
    while (f >> type >> current)
    {
        if      (type == IN)      Words.add(current);
        else if (type == OUT)     Words.eliminate(current);
        else if (type == FREC)    g << Words.get_frec(current) << "\n";
        else if (type == MAXPREF) g << Words.get_prefix_length(current) << "\n";
    }
    return 0;
}