Cod sursa(job #977258)

Utilizator Impaler_009Mihai Nitu Impaler_009 Data 25 iulie 2013 12:06:05
Problema Trie Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 kb
#include <fstream>
#include <string>

using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");

struct trie_node
{
    int nr,sons;
    trie_node *s[29];
}*trie;

void initialize (trie_node *node)
{
    node->sons=0;
    node->nr=0;
    for (int i=0; i<26; i++) node->s[i]=NULL;
}

void add_word (trie_node *current, string word, int i)
{
    int letter = word[i]-'a';
    if (i==word.length()) {current->nr++; return;}

    if (current->s[letter]==NULL)
        {
            current->sons++;
            current->s[letter]=new trie_node;
            initialize (current->s[letter]);
        }
    add_word (current->s[letter],word,i+1);
}

bool delete_word (trie_node *current, string word, int i)
{
    int letter=word[i]-'a';

    if (i==word.length()) current->nr--;
    else if (delete_word (current->s[letter],word,i+1))
    {
        current->sons--;
        current->s[letter]=NULL;
    }

    if (current->nr==0 && current->sons==0 && current!=trie)
    {delete current; return 1;}
    return 0;
}

int search_word (trie_node *current, string word, int i)
{
    int letter=word[i]-'a';
    if (i==word.length()) return current->nr;
    else if (current->s[letter]!=NULL) return search_word (current->s[letter],word,i+1);
    return 0;
}

int search_prefix (trie_node *current, string word, int i)
{
    int letter=word[i]-'a';
    if (current->s[letter]==NULL) return 0;
    return search_prefix (current->s[letter],word,i+1)+1;
}

int main()
{
    trie= new trie_node;
    initialize (trie);
    int op;
    string word;
    while (fin>>op>>word)
    {
        if (op==0) add_word (trie,word,0);
        else if (op==1) delete_word (trie,word,0);
        else if (op==2) fout<<search_word (trie,word,0)<<"\n";
        else if (op==3) fout<<search_prefix (trie,word,0)<<"\n";
    }
    return 0;
}