Cod sursa(job #1389688)

Utilizator robertstrecheStreche Robert robertstreche Data 16 martie 2015 15:31:02
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.22 kb
#include <fstream>
#include <cstring>

#define LMAX 35
#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]==NULL)
       {
           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]=NULL;
           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]==NULL)
         return;
       nod=nod->son[val];
       poz++;
    }
    nod->nr--;
    if (nod->fii==0 && nod->nr==0)
       {nod->tata->fii--;
        nod->tata->son[val]=NULL;
        nod=nod->tata;
       }
}
inline void apar()
{
    poz=0;
    nod=rad;
    while (S[poz])
    {
       int val=S[poz]-'a';
       if (nod->son[val]==NULL)
         {
             int corect;
             c>>corect;
             //g<<0<<'\n';
             return;
         }
       nod=nod->son[val];
       poz++;
    }

  // int corect;
  // c>>corect;
  // if (corect!=nod->nr)g<<2<<" "<<nod->nr<<" "<<corect<<" "<<nr<<'\n';
    g<<nod->nr<<'\n';
}
inline void prefix()
{
    poz=0;
    nod=rad;
    while (S[poz] && nod->fii)
    {
       int val=S[poz]-'a';
       if (nod->fii==0 || nod->son[val]==NULL)
        break;
       poz++;
       nod=nod->son[val];
    }
   //int corect;
  // c>>corect;
  // if (corect!=poz)g<<3<<" "<<poz<<" "<<corect<<" "<<nr<<'\n';
   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();
}