Cod sursa(job #228474)

Utilizator RobytzzaIonescu Robert Marius Robytzza Data 7 decembrie 2008 12:56:28
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.04 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))<<"";
                    break;
                 }
          case 3:{
                    fout<<pref_max(strlen(s))<<"";
                    break;
                 }
     }
     }
     return 0;
}