Cod sursa(job #1165529)

Utilizator SapientiaCHIRILA ADRIAN Sapientia Data 2 aprilie 2014 19:01:03
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <iostream>
#include <fstream>
#include <string.h>
#define LMAX 30
using namespace std;
int n,m;
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)
{
  int lit;
  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()
{
    ifstream f("trie.in");
    ofstream g("trie.out");
    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 g<<tiparesteprefix(rad)<<"\n";
    }
    f.close();
    g.close();
    return 0;
}