Cod sursa(job #585405)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 29 aprilie 2011 10:11:16
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.92 kb
#include <fstream>
#include <cstring>
#define cat(s) ((*s)-'a')
using namespace std;
class trie
      {public:
               int cont,nrfii;
               trie *fiu[26];
      trie()
               {cont=nrfii=0;
               memset(fiu,0,sizeof(fiu));}
      void insert(trie *,char*);
      int del(trie*,char*);
      int query(trie*,char*);
      int prefix_comun(trie*,char*,int);};
trie *t=new trie();

void trie::insert(trie *sursa,char *s) 
{if(*s=='\0') 
        {++sursa->cont;
        return;}
if(!sursa->fiu[cat(s)]) 
        {sursa->fiu[cat(s)]=new trie();
        ++sursa->nrfii;}
sursa->insert(sursa->fiu[cat(s)],s+1);}
            
int trie::del(trie *sursa,char *s) 
{if(*s=='\0') 
        --sursa->cont;
else 
        if(sursa->del(sursa->fiu[cat(s)],s+1)) 
               {sursa->fiu[cat(s)]=0;
               --sursa->nrfii;}
if(!(sursa->cont)&&!(sursa->nrfii)&&sursa!=t) 
      {delete sursa;
      return 1;}
return 0;}
        
int trie::query(trie *sursa, char *s) 
{if(*s=='\0') 
        return sursa->cont;
if(sursa->fiu[cat(s)]) 
        return query(sursa->fiu[cat(s)],s+1);
return 0;}

int trie::prefix_comun(trie *sursa, char *s,int lg) 
{if(*s=='\0'||sursa->fiu[cat(s)]==0) 
       return lg;
return prefix_comun(sursa->fiu[cat(s)],s+1,lg+1);}

int main()
{int ce;
char cuv[32];
ifstream f("trie.in");
ofstream g("trie.out");
for(;!f.eof();f.get()) 
     {f>>ce;
     f>>cuv;
     if(f.good()) 
            if(!ce) 
                   t->insert(t,cuv);
            else 
                   if(ce==1) 
                           t->del(t,cuv);
                   else 
                           if(ce==2)
                                    g<<t->query(t,cuv)<<'\n';
                           else 
                                    if(ce==3) 
                                              g<<t->prefix_comun(t,cuv,0)<<'\n';}
f.close();
g.close();
return 0;}