Cod sursa(job #303962)

Utilizator otilia_sOtilia Stretcu otilia_s Data 10 aprilie 2009 16:32:04
Problema Trie Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
#include<stdio.h>
#include <string.h>
struct Trie 
        { 
         int cnt,nrfii;
         Trie *fiu[26];
         Trie() { cnt=nrfii=0; memset(fiu,0,sizeof(fiu));}
        };
Trie *T=new Trie;

void inserare(Trie *nod, char *s)
{
 if (s[0]=='\n') { nod->cnt++; return;}
 if (nod->fiu[s[0]-'a']==NULL)
    {
     nod->fiu[s[0]-'a']= new Trie;
     nod->nrfii++;
    }   
 inserare(nod->fiu[s[0]-'a'],s+1);
}


int stergere(Trie *nod, char *s)
{
 if (s[0]=='\n') nod->cnt--;
    else {
           if (stergere(nod->fiu[s[0]-'a'],s+1))
               {
                 nod->nrfii--;
                 nod->fiu[s[0]-'a']=0;
               } 
         }
 if (nod->cnt==0 && nod->nrfii==0 && nod!=T)  { delete nod; return 1;}
 return 0;
}

int nrap(Trie *nod, char *s)
{
 if (s[0]=='\n') return nod->cnt;
 if (nod->fiu[s[0]-'a']) return nrap(nod->fiu[s[0]-'a'],s+1);
    else return 0;
}

int prefix(Trie *nod, char *s, int k)
{
 if (s[0]=='\n' || nod->fiu[s[0]-'a']==0) return k;
 return prefix(nod->fiu[s[0]-'a'],s+1,k+1);
}

int main()
{ 
 FILE *fin=fopen("trie.in","r");
 FILE *fout=fopen("trie.out","w");
 char sir[32];
 fgets(sir,32,fin);
 while (!feof(fin))
  {
   switch (sir[0])
    {
     case '0': { inserare(T,sir+2); break;}
     case '1': { stergere(T,sir+2); break;}
     case '2': { fprintf(fout,"%d\n",nrap(T,sir+2)); break;}
     case '3': { fprintf(fout,"%d\n",prefix(T,sir+2,0)); break;}
    }
   fgets(sir,32,fin);
  }
 switch (sir[0])
    {
     case '0': { inserare(T,sir+2); break;}
     case '1': { stergere(T,sir+2); break;}
     case '2': { fprintf(fout,"%d\n",nrap(T,sir+2)); break;}
     case '3': { fprintf(fout,"%d\n",prefix(T,sir+2,0)); break;}
    }
 fcloseall();
 return 0;
}