Cod sursa(job #2267376)

Utilizator alex2209alexPavel Alexandru alex2209alex Data 23 octombrie 2018 16:17:39
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.26 kb
#include <fstream>

#include <string.h>



using namespace std;



ifstream fin ("trie.in");

ofstream fout ("trie.out");



struct nod

{

     int nr_ap,nr_fin;

     nod *sir[26];

     nod ()

     {

         nr_ap=nr_fin=0;

         memset(sir,0,sizeof(sir));

     }

}*A;

char s[30];



void baga(int lg)

{

     nod *Q=A;

     for (int i=0;i<lg;i++)

     {

          if (Q->sir[s[i]-'a']==NULL)

               Q->sir[s[i]-'a']=new nod;

          Q=Q->sir[s[i]-'a'];

          Q->nr_ap++;

     }

     Q->nr_fin++;

}



void sterge(int lg)

{

     nod *Q=A,*Q1;

     for (int i=0;i<lg;i++)

     {

          Q1=Q;

          Q=Q->sir[s[i]-'a'];

          Q->nr_ap--;

          if (Q1->nr_ap==0)

               delete Q1;

          else

               if (Q->nr_ap==0)

                    Q1->sir[s[i]-'a']=NULL;

     }

     Q->nr_fin--;

     if (Q->nr_ap==0)

          delete Q;

}





int nr_aparitii(int lg)

{

     nod *Q=A;

     for (int i=0;i<lg;i++)

     {

          if (Q->sir[s[i]-'a']==NULL)

               return 0;

          Q=Q->sir[s[i]-'a'];

     }

     return Q->nr_fin;

}



int pref_max(int lg)

{

     nod *Q=A;

     for (int i=0;i<lg;i++)

     {

          if (Q->sir[s[i]-'a']==NULL)

               return i;

          Q=Q->sir[s[i]-'a'];

     }

     return lg;

}



int main()

{

     int x;

     char c;

     A=new nod;

     A->nr_ap=1;

     while (!fin.eof())

     {

          fin>>x;

          fin.get(c);

          fin.getline(s,25);

          if (!strlen(s))

               return 0;

     switch (x)

     {

          case 0:{

                    baga(strlen(s));

                    break;

                 }

          case 1:{

                    sterge(strlen(s));

                    break;

                 }

          case 2:{

                    fout<<nr_aparitii(strlen(s))<<"\n";

                    break;

                 }

          case 3:{

                    fout<<pref_max(strlen(s))<<"\n";

                    break;

                 }

     }

     }

     return 0;

}