Cod sursa(job #940638)

Utilizator SteveStefan Eniceicu Steve Data 16 aprilie 2013 20:40:49
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <fstream>
#include <cstring>

using namespace std;

struct Trie
{
    int cnt, nr_fii;
    Trie* F[26];
    Trie ()
    {
        cnt = nr_fii = 0;
        memset (F, 0, sizeof (F));
    }
};

Trie *T = new Trie;

void Add_Word (char* v, Trie* nod)
{
    if (*v == '\0')
    {
        nod -> cnt++;
        return;
    }
    if (nod -> F[*v - 'a'] == 0)
    {
        Trie* aux = new Trie;
        nod -> F[*v - 'a'] = aux;
        nod -> nr_fii++;
    }
    Add_Word (v + 1, nod -> F[*v - 'a']);
}

void Erase_Word (char* v, Trie* nod)
{
    if (*v == '\0')
    {
        nod -> cnt--;
        return;
    }
    Erase_Word (v + 1, nod -> F[*v - 'a']);
    if (nod -> F[*v - 'a'] -> nr_fii == 0 && nod -> F[*v - 'a'] -> cnt == 0) delete (nod -> F[*v - 'a']), nod -> F[*v - 'a'] = 0, nod -> nr_fii--;
}

int Find_Word (char* v, Trie* nod)
{
    if (nod == 0) return 0;
    if (*v == '\0') return nod -> cnt;
    return Find_Word (v + 1, nod -> F[*v - 'a']);
}

int Find_Prefix (char* v, Trie* nod)
{
    if (*v == '\0') return 0;
    if (nod -> F[*v - 'a'] == 0) return 0;
    return 1 + Find_Prefix (v + 1, nod -> F[*v - 'a']);
}

int main ()
{
    int a;
    char v[25];
    ifstream fin ("trie.in");
    ofstream fout ("trie.out");
    while (1)
    {
        fin >> a;
        if (fin.eof ()) break;
        fin >> v;
        if (a == 0) Add_Word (v, T);
        else if (a == 1) Erase_Word (v, T);
        else if (a == 2) fout << Find_Word (v, T) << "\n";
        else fout << Find_Prefix (v, T) << "\n";
    }
    fin.close ();
    fout.close ();
    return 0;
}