Cod sursa(job #1340532)

Utilizator dianaa21Diana Pislaru dianaa21 Data 11 februarie 2015 21:22:04
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.07 kb
#include <fstream>
using namespace std;
ifstream is ("trie.in");
ofstream os ("trie.out");

struct Trie {
    int countWords;
    int countSons;
    int isEnd;
    Trie* sons[26];
} *head;

int type;
string word;

void AddWord();
bool DeleteWord(int i, Trie* node);
int FindWord();
int PreffixLength();

int main()
{
    head = new Trie();
    while(is >> type)
    {
        is >> word;
        switch(type) {
            case 0:
                AddWord();
                break;
            case 1:
                DeleteWord(0, head);
                break;
            case 2:
                os << FindWord() << "\n";
                break;
            case 3:
                os << PreffixLength() << "\n";
                break;
        }
    }

    is.close();
    os.close();
    return 0;
}
void AddWord()
{
    int letter;
    Trie *node = head;
    for(int i = 0; i < word.size(); ++i)
    {
        letter = word[i] - 'a';
        if(node->sons[letter] == 0)
        {
            node->countSons++;
            node->sons[letter] = new Trie();
        }
        node = node->sons[letter];
    }
    node->isEnd++;
}
bool DeleteWord(int i, Trie* node)
{
    if(i == word.size())
        node->isEnd--;

    else
    {
        int letter = word[i] - 'a';
        if( DeleteWord(i+1, node->sons[letter]) )
        {
            node->countSons--;
            node->sons[letter] = 0;
        }
    }

    if(node->countSons == 0 && node->isEnd == 0 && node != head)
    {
        delete node;
        return true;
    }
    else
        return false;
}
int FindWord()
{
    Trie* node = head;
    for(int i = 0; i < word.size(); ++i)
    {
        if(node->sons[word[i]-'a'] == 0)
            return 0;
        node = node->sons[word[i]-'a'];
    }

    return node->isEnd;
}
int PreffixLength()
{
    Trie* node = head;
    for(int i = 0; i < word.size(); ++i)
    {
        if(node->sons[word[i]-'a'] == 0)
            return i;
        node = node->sons[word[i]-'a'];
    }
    return word.size();
}