Cod sursa(job #1158398)

Utilizator CypyNXEnculescu Ciprian CypyNX Data 28 martie 2014 20:56:22
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.98 kb
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <fstream>
#define litera (*c-'a')

using namespace std;

ifstream in("trie.in");
ofstream out("trie.out");
/**_______________________________________________________________________________________________ Clasa Nod */
class Nod
{
    int APARITII;
    int NR_FII;
    Nod *FII[26];
    public:
        Nod ();
    friend class Trie;
};

Nod::Nod()
{
    APARITII=NR_FII=0;
    memset(FII,0,sizeof(FII));
}
/**______________________________________________________________________________________________ Clasa Trie */
class Trie
{
    Nod *START;
    public:
        Trie();
        void insert(char*);
        void call_insert(Nod*,char*);
        void sterge(char*);
        int call_sterge(Nod*,char*);
        void getAPARITII(char*);
        void call_getAPARITII(Nod*,char*);
        void prefix(char*);
        void call_prefix(Nod*,char*,int);
};

Trie::Trie()
{
    START=new Nod();
}

void Trie::insert(char *c)
{
    call_insert(START,c);
}

void Trie::call_insert(Nod *v,char *c)
{
    if(! *c) {
              v->APARITII ++;
              return;
             }

    if(!v->FII[ litera ]) {
                           v->NR_FII ++;
                           v->FII[ litera ] = new Nod();
                          }

    call_insert(v->FII[ litera ],c+1);
}

void Trie::sterge(char *c)
{
    call_sterge(START,c);
}

int Trie::call_sterge(Nod *v,char *c)
{
    if(! *c) v->APARITII --;
      else if(call_sterge(v->FII[ litera ],c+1)) {
                                                  v->NR_FII-- ;
                                                  v->FII[litera] = 0;
                                                 }
    if(v->APARITII == 0 && v->NR_FII == 0 && v != START)
        {
         delete(v);
         return 1;
        }
    return 0;
}

void Trie::getAPARITII(char *c)
{
    call_getAPARITII(START,c);
}

void Trie::call_getAPARITII(Nod *v,char *c)
{
    if(! *c)  {out<<v->APARITII<<endl;return;}
    if(v->FII[litera]) call_getAPARITII(v->FII[litera],c+1);
}

void Trie::prefix(char *c)
{
    call_prefix(START,c,0);
}

void Trie::call_prefix(Nod *v,char *c,int k)
{
   if ( !*c || v->FII[litera] == 0) out<<k<<endl;
     else call_prefix(v->FII[litera],c+1,k+1);
}
/**____________________________________________________________________________________________ Functia Main */
int main()
{
Trie dictionar;
char cuvant[20];
int n;
in>>n;
while(in.get()!=EOF)
    {
     in>>cuvant;
     switch (n) {case  0  : {dictionar.insert(cuvant);
                             break;}
                 case  1  : {dictionar.sterge(cuvant);
                             break;}
                 case  2  : {dictionar.getAPARITII(cuvant);
                             break;}
                 case  3  : {dictionar.prefix(cuvant);
                             break;}
                 }
     in>>n;
    }
in.close();
return 0;
}