Cod sursa(job #267735)

Utilizator cnatlLaurian cnatl Data 27 februarie 2009 22:34:39
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
#include<stdio.h>
#include<time.h>
struct trie { trie *next[28]; int cont, fii;};
trie *root, *top, *paux,*coada[22];
void read(),adauga(),sterge(),contor(),prefix();
int cod,i,k[25],l,j,max;
char c[25];
int main()
{   top=new trie; top->cont=0; for(j=1;j<=26;j++) top->next[j]=0;
    read();

    printf("\ntime=%f sec.\n",(double)clock()/CLK_TCK);
    return 0;
}
void read()
{    freopen("trie.in","r",stdin);
     freopen("trie.out","w",stdout);

     while(!(feof(stdin)))
     {    scanf("%d",&cod);
          scanf("%s",c);
          l=0;
          for(i=0;c[i]!=NULL;i++){ k[i]=(int)(c[i]-'a')+1; l++;}
          if(cod==0){ adauga(); continue;}
          if(cod==1){ sterge(); continue;}
          if(cod==2){ contor(); continue;}
          prefix();
     }
}
void adauga()
{     root=top;
      for(i=0;i<l;i++)
      {   if(root->next[k[i]]){ root=root->next[k[i]]; continue;}
           paux=new trie; paux->cont=0; paux->fii=0;
           for(j=1;j<=26;j++) paux->next[j]=0;
          root->next[k[i]]=paux; root->fii++;
          root=paux;
      }
      root->cont++;
}
void sterge()
{      root=top;
       for(i=0;i<l;i++){ coada[i]=root; root=root->next[k[i]];}
       root->cont--;
       for(i=l;i>0;i--)
       {   if(root->cont) return;
           if(root->fii) return;
           paux=root;
           root=coada[i-1]; root->next[k[i-1]]=0; root->fii--;
           delete paux;
        }
}
void contor()
{     root=top;
      for(i=0;i<l;i++) root=root->next[k[i]];
      printf("%d\n",root->cont);
}
void prefix()
{     root=top;  max=0;
      for(i=0;i<l;i++)
       { if(root->next[k[i]]){ root=root->next[k[i]];max++; continue;}
         break;
       }

      printf("%d\n",max);
}