Cod sursa(job #1131535)

Utilizator Impaler_009Mihai Nitu Impaler_009 Data 28 februarie 2014 21:17:40
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.04 kb
#include <fstream>

using namespace std;

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

string w;
int n,op;

struct trie_node
{
    int nr,sons;
    trie_node *s[26];

    trie_node ()
    {
        nr = 0;
        sons = 0;
        for (int i=0; i<26; ++i)
            s[i] = NULL;
    }
};

void trie_insert (trie_node *current, int i)
{
    if (i == w.length ())
    {
        current->nr++;
        return;
    }

    int letter = w[i]-'a';

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

    trie_insert (current->s[letter],i+1);
}

void trie_delete (trie_node *current, int i)
{
    if (i == w.length())
    {
        current->nr--;
        return;
    }

    int letter = w[i]-'a';

    trie_delete (current->s[letter],i+1);

    if (current->s[letter]->nr == 0 && current->s[letter]->sons == 0)
    {
        delete current->s[letter];
        current->s[letter] = NULL;
        current->sons--;
    }
}

int trie_search (trie_node *current, int i)
{
    if (i == w.length())
    {
        return current->nr;
    }

    int letter = w[i] - 'a';

    if (current->s[letter] == NULL)
       return 0;
    return (trie_search(current->s[letter],i+1));
}

int trie_prefix_search (trie_node *current, int i)
{
    if (i == w.length ())
        return w.length ();

    int letter = w[i] - 'a';

    if (current->s[letter] == NULL)
        return i;
    return trie_prefix_search (current->s[letter],i+1);
}

int main()
{
    trie_node *trie = new trie_node;

    while (fin>>op>>w)
    {
        if (!op)
        {
            trie_insert (trie,0);
        }
        else if (op == 1)
        {
            trie_delete (trie,0);
        }
        else if (op == 2)
        {
            fout<<trie_search (trie,0);
        }
        else if (op == 3)
        {
            fout<<trie_prefix_search (trie,0);
        }

        if (op>1)
        {
            fout<<"\n";
        }
    }
}