Cod sursa(job #977267)

Utilizator Impaler_009Mihai Nitu Impaler_009 Data 25 iulie 2013 12:23:41
Problema Trie Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 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[26];
    trie_node ()
    {
        sons=0;
        nr=0;
        for (int i=0; i<26; i++) s[i]=NULL;
    }
}*trie;

int len;
string word;

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

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

bool delete_word (trie_node *current, int i)
{
    if (i==len) current->nr--;
    else {int letter=word[i]-'a'; if (delete_word (current->s[letter],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, int i)
{
    if (i==len) return current->nr;
    else {int letter=word[i]-'a'; if (current->s[letter]!=NULL) return search_word (current->s[letter],i+1);}
    return 0;
}

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

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