Cod sursa(job #1389261)

Utilizator robertstrecheStreche Robert robertstreche Data 16 martie 2015 09:36:38
Problema Trie Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 1.91 kb
#include <fstream>
#include <cstring>

#define LMAX 31
#define NRCHAR 27

using namespace std;

ifstream f("trie.in");
ofstream g("trie.out");

int type,poz;
char S[LMAX];

struct boss
{
    int nr,fii;
    boss *tata,*son[NRCHAR];
    boss(){
        nr=fii=0;
        memset(son,NULL,sizeof(son));}
}*rad=new boss(),*nod;

inline void add()
{
    poz=0;
    nod=rad;
    while (S[poz])
    {
       int val=S[poz]-'a';
       if (nod->son[val]==NULL)
       {
           nod->son[val]=new boss();
           nod->son[val]->nr=0;
           nod->fii++;
           nod->son[val]->tata=nod;
           nod=nod->son[val];
           poz++;
           continue;
       }
      nod=nod->son[val];
      poz++;
    }
    nod->nr++;
}
inline void del()
{
    poz=0;
    nod=rad;
    while (S[poz])
    {
       int val=S[poz]-'a';
       if (nod->son[val]==NULL)
         return;
       nod=nod->son[val];
       poz++;
    }
    nod->nr--;
    if (nod->fii==0 && nod->nr==0)
       {nod->tata->fii--;
        if (nod->tata->fii==0)
          delete nod->tata;
        delete nod;
       }

}
inline void apar()
{
    poz=0;
    nod=rad;
    while (S[poz])
    {
       int val=S[poz]-'a';
       if (nod->son[val]==NULL)
         {
             g<<0<<'\n';
             return;
         }
       nod=nod->son[val];
       poz++;
    }
    g<<nod->nr<<'\n';
}
inline void prefix()
{
    poz=0;
    nod=rad;
    while (S[poz] && nod)
    {
       int val=S[poz]-'a';
       poz++;
       if (nod->fii==0 || nod->son[val]==NULL)
        break;
       nod=nod->son[val];
    }
   g<<poz-1<<'\n';
}
int main()
{
    while (f>>type)
    {
       f>>S;
       switch (type){
       case 0:{add();continue;};
       case 1:{del();continue;};
       case 2:{apar();continue;};
       case 3:{prefix();continue;};}
    }

    f.close();
    g.close();
}