Cod sursa(job #756103)

Utilizator XladhenianGrigorita Vlad-Stefan Xladhenian Data 9 iunie 2012 01:25:20
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.52 kb

#include <fstream>
using namespace std;

struct TNod;
typedef TNod *PNod;
struct TNod
{
 long Aparitii;
 long SubAparitii;
 PNod Copii[26];
};

PNod T;

PNod CreazaNod(void)
{
 PNod res = new TNod;
 res->Aparitii = 0;
 res->SubAparitii = 0;
 long i;
 for (i = 0;i < 26;i += 1)
  {
   res->Copii[i] = 0;
  }
 return res;
}

void Adauga(PNod &N,char *cuv)
{
 if (N == 0)
   {
    N = CreazaNod();
   }
 if (cuv[0] == 0)
   {
    N->Aparitii += 1;
   }
  else
   {
    N->SubAparitii += 1;
    Adauga(N->Copii[cuv[0] - 'a'],cuv + 1);
   }
}

void Sterge(PNod &N,char *cuv)
{
 if (cuv[0] == 0)
   {
    N->Aparitii -= 1;
   }
  else
   {
    Sterge(N->Copii[cuv[0] - 'a'],cuv + 1);
    N->SubAparitii -= 1;
   }
 if ((N->Aparitii == 0) && (N->SubAparitii == 0))
   {
    delete N;
    N = 0;
   }
}

void Tipareste(PNod &N,char *cuv,fstream &fout)
{
 if (N == 0)
   {
    fout << "0\n";
    return ;
   }
 if (cuv[0] == 0)
   {
    fout << N->Aparitii << "\n";
   }
  else
   {
    Tipareste(N->Copii[cuv[0] - 'a'],cuv + 1,fout);
   }
}

long Prefix(PNod &N,char *cuv,long len,fstream &fout)
{
 if (cuv[0] == 0)
   {
    if (N != 0)
      {
       if ((N->Aparitii > 0) || (N->SubAparitii > 0))
         {
          fout << len << "\n";
          return 0;
         }
      }
    return 1;
   }
  else
   {
    if (N->Copii[cuv[0] - 'a'] == 0)
      {
       if ((N->Aparitii > 0) || (N->SubAparitii > 0))
         {
          fout << len << "\n";
          return 0;
         }
       return 1;
      }
    if (Prefix(N->Copii[cuv[0] - 'a'],cuv + 1,len + 1,fout) != 0)
      {
       if ((N->Aparitii > 0) || (N->SubAparitii > 0))
         {
          fout << len << "\n";
          return 0;
         }
       return 1;
      }
    return 0;
   }
}

int main(void)
{
 fstream fin("trie.in",ios::in);
 fstream fout("trie.out",ios::out);
 char linie[256],cuv[250];
 long op;
 while (!fin.eof())
  {
   fin.getline(linie,250);
   if (sscanf(linie,"%ld %s",&op,cuv) != 2)
     {
      break;
     }
   switch (op)
    {
     case 0 :
       {
        Adauga(T,cuv);
       }
      break;
     case 1 :
       {
        Sterge(T,cuv);
       }
      break;
     case 2 :
       {
        Tipareste(T,cuv,fout);
       }
      break;
     case 3 :
       {
        if (Prefix(T,cuv,0,fout) != 0)
          {
           fout << "0\n";
          }
       }
      break;
    };
  }
 fin.close();
 fout.close();
 return 0;
}