Cod sursa(job #1579308)

Utilizator sfechisalin@yahoo.comSfechis Alin [email protected] Data 24 ianuarie 2016 16:52:53
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <fstream>
#include <cstring>
#define Sigma 26
using namespace std;
ofstream fout("trie.out");
ifstream fin("trie.in");
char sir[Sigma];
int contor;
struct Trie
{
    Trie():fii(0),nr_cuv(0)
    {
        memset(Fiu, 0, sizeof(Fiu));
    }
    int fii, nr_cuv;
    Trie *Fiu[Sigma];
} *T = new Trie;
void Inserare(Trie *nod, char *s)
{
    if (*s=='\0')
    {
        nod->nr_cuv++;
        return;
    }
    if (!nod->Fiu[*s-'a'])
    {
        nod->Fiu[*s-'a']=new Trie;
        ++nod->fii;
    }
    Inserare(nod->Fiu[*s-'a'],s+1);
}
bool Sterge(Trie *nod, char *s)
{
    if ( *s == '\0' )
        nod->nr_cuv--;
    else
        if (Sterge(nod->Fiu[*s-'a'],s+1))
        {
            nod->Fiu[*s-'a']=0;
            nod->fii--;
        }
    if (nod->nr_cuv==0 && nod->fii==0 && nod!=T )
    {
        delete nod;
        return true;
    }
    return false;
}
int Count(Trie *nod, char *s)
{
    if (*s=='\0')
        return nod->nr_cuv;
    if ( nod->Fiu[*s-'a'] )
            return Count(nod->Fiu[*s-'a'],s+1);
    return 0;
}
void Prefix(Trie *nod, char *s, int contor)
{
    if(*s=='\0' || !nod->Fiu[*s-'a'] )
    {
        fout<<contor<< "\n";
        return;
    }
    Prefix(nod->Fiu[*s-'a'],s+1,contor+1);
}
int main()
{
    while(fin.getline(sir,Sigma))
        switch(sir[0])
        {
            case '0':Inserare(T,sir+2);break;
            case '1':Sterge(T,sir+2);break;
            case '2':fout<<Count(T,sir+2)<<"\n";break;
            case '3':Prefix(T,sir+2,contor);break;
        }
}