Cod sursa(job #1165543)

Utilizator SapientiaCHIRILA ADRIAN Sapientia Data 2 aprilie 2014 19:05:44
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <fstream>
#define LMAX 30
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct nod
{
    int fii,nr;
    nod *urm[LMAX];
    nod()
    {
        int i;
        nr=fii=0;
        for(i=0;i<=26;++i) urm[i]=NULL;
    }
}*rad;
char c[30];
int op;
void insert(nod *p)
{
   int i,lit;
   for(i=0;c[i]!='\0';++i)
   {
      lit=c[i]-'a';
      if (p->urm[lit]==NULL)
      {
         p->urm[lit]=new nod();
         p->fii++;
      }
      p=p->urm[lit];
   }
   p->nr++;
}
bool Erase(nod *p,int i)
{
    if (c[i]=='\0') p->nr--;
    else
    {
        int lit=c[i]-'a';
        if (Erase(p->urm[lit],i+1))
        {
              --p->fii;
              p->urm[lit]=NULL;
        }
    }
    if (p->fii==0 && p->nr==0 && p!=rad)
    {
       delete p;
       return true;
    }
    return false;
}
int tipareste_ap(nod *p)
{
   int i,lit;
   for(i=0;c[i]!='\0';++i)
   {
      lit=c[i]-'a';
      if (p->urm[lit]==NULL) return 0;
      else p=p->urm[lit];
   }
   return p->nr;
}
int tiparesteprefix(nod *p)
{
   int i,lit;
   for(i=0;c[i]!='\0';++i)
   {
      lit=c[i]-'a';
      if (p->urm[lit]==NULL) return i;
      else p=p->urm[lit];
   }
   return(strlen(c));
}
int main()
{
    rad=new nod;
    while(f>>op>>c)
    {
       if (op==0) insert(rad);
       else if (op==1) Erase(rad,0);
       else if (op==2) g<<tipareste_ap(rad)<<"\n";
       else if (op==3) g<<tiparesteprefix(rad)<<"\n";
    }
    f.close();
    g.close();
    return 0;
}