Cod sursa(job #1389658)

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

#define LMAX 31
#define NRCHAR 28

using namespace std;

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

int type,poz,nr;
char S[LMAX];

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

inline void add()
{
    poz=0;
    nod=rad;
    while (S[poz])
    {
       int val=S[poz]-'a';
       if (nod->son[val]==0)
       {
           nod->son[val]=new boss();
           nod->son[val]->nr=0;
           nod->son[val]->fii=0;
           nod->fii++;
           for (int i=0;i<NRCHAR;i++)nod->son[val]->son[i]=0;
           nod->son[val]->tata=nod;
           nod=nod->son[val];
           poz++;
           continue;
       }
      nod=nod->son[val];
      poz++;
    }
   nod->nr++;
}
inline void del()
{
    int val;
    poz=0;
    nod=rad;
    while (S[poz])
    {
       val=S[poz]-'a';
       if (nod->son[val]==0)
         return;
       nod=nod->son[val];
       poz++;
    }
    nod->nr--;
    if (nod->fii==0 && nod->nr==0)
       {nod->tata->fii--;
        nod->tata->son[val]=0;
       }
}
inline void apar()
{
    poz=0;
    nod=rad;
    while (S[poz])
    {
       int val=S[poz]-'a';
       if (nod->son[val]==0)
         {
             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';
       if (nod->fii==0 || nod->son[val]==0)
        break;
       poz++;
       nod=nod->son[val];
    }
   g<<poz<<'\n';
}
int main()
{
    while (f>>type)
    {
        nr++;
       f>>S;
       switch (type){
       case 0:{add();continue;};
       case 1:{del();continue;};
       case 2:{apar();continue;};
       case 3:{prefix();continue;};}
    }
    f.close();
    g.close();
}