Cod sursa(job #872709)

Utilizator vgabi94Vaduva Gabriel vgabi94 Data 6 februarie 2013 15:30:49
Problema Trie Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.84 kb
#include <fstream>
using namespace std;

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

struct Trie {
    Trie();
    void addWord(char*);
    bool delWord(char*);
    int countWords(char*);
    int lcp(char*, int);
private:
    int words;
    int prefixes;
    Trie* edges[26];
    static Trie* top;
};
Trie* Trie::top = NULL;
Trie::Trie()
{
    if (top == NULL) top = this;
    words = prefixes = 0;
    for (int i = 0; i < 26; i++) edges[i] = NULL;
}
void Trie::addWord(char* word)
{
    if (word[0] == '\0')
        words += 1;
    else
    {
        prefixes += 1;
        int k = word[0]; k -= 97;
        if (edges[k] == NULL)
            edges[k] = new Trie;

        edges[k]->addWord(word+1);
    }
}
bool Trie::delWord(char* word)
{
    int k = word[0]; k -= 97;
    if (word[0] == '\0')
        words--;
    else if (edges[k]->delWord(word+1))
    {
        edges[k] = NULL;
        prefixes--;
    }
    if (words == 0 && prefixes == 0 && this != top)
    {
        delete this;
        return true;
    }
    return false;
}
int Trie::countWords(char* word)
{
    int k = word[0]; k -= 97;
    if (word[0] == '\0')
        return words;
    else if (edges[k] == NULL)
        return 0;
    else
        return edges[k]->countWords(word+1);
}
int Trie::lcp(char* word, int c)
{
    int k = word[0]; k -= 97;
    if (word[0] == '\0' || edges[k] == 0)
        return c;
    return edges[k]->lcp(word+1, c+1);
}

int main()
{
    char wr[22]; int op; Trie tr;
    while ((in >> op, in >> wr) && !in.eof())
    {
        switch (op)
        {
            case 0: tr.addWord(wr); break;
            case 1: tr.delWord(wr); break;
            case 2: out << tr.countWords(wr) << '\n'; break;
            case 3: out << tr.lcp(wr, 0) << '\n'; break;
        }
    }
    return 0;
}