Cod sursa(job #412820)

Utilizator nicolaetitus12Nicolae Titus nicolaetitus12 Data 6 martie 2010 14:10:35
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.3 kb
#include <string.h>
#include <stdio.h>
#include <conio.h>
#define N 100002
int a[N][26],vf=1;
int nr[N];
int tata[N];

void afiseaza()
{int i,j;
 printf("  ");
 for (i=1;i<=40;i++)
 {printf("%3d",i);
 }
 printf("\n");
 for (j=0;j<26;j++)
 {printf("%c ",j+'a');
  for (i=1;i<=vf;i++)
  {printf("%3d",a[i][j]);
  }
  printf("\n");
 }
 printf("----------------------------------\n");
 
}

 int main ()
{  int op,i,l,p,flag;
   char cuv[50];
 
   freopen("trie.in","r",stdin);
   freopen("trie.out","w",stdout);

   do
   {
      scanf("%d %s",&op,cuv);
      l=strlen(cuv);
      switch(op)
      {
         case 0://adauga
            for (i=0,p=1;i<l;i++)
            {  if(a[p][cuv[i]-'a']==0)
               {  a[p][cuv[i]-'a']=++vf;
                  tata[vf]=p;
                  p=vf;
                  
               }
               else
               {   p=a[p][cuv[i]-'a'];
               }
            }
            nr[p]++;
         break;
   
         case 1: //sterge
            for (i=0,p=1;i<l;i++)
            {  p=a[p][cuv[i]-'a'];
            }
            nr[p]--;
            
            for (;p!=1;p=tata[p])
            {  flag=0;
               for (i=0;i<26;i++)
               {  if(a[p][i]!=0)
                  {  flag=1;
                     break;
                  }
               }
               if(flag==0)
               {  for (i=0;i<26;i++)
                  {  if(a[tata[p]][i]==p)
                     {  a[tata[p]][i]=0;
                        break;
                     }
                  }
               }
            }
            nr[p]--;
         break;

         case 2: //nr aparitii
            for (flag=0,i=0,p=1;i<l;i++)
            {  if(a[p][cuv[i]-'a']==0)
               {  flag=1;
                  break;
               }
               p=a[p][cuv[i]-'a'];
            }
            if(flag)
            {  printf("0\n");
            }
            else
            {  printf("%d\n",nr[p]);
            }
         break;

         case 3: //cel mai lung prefix
            for (i=0,p=1;i<l&&a[p][cuv[i]-'a']!=0;i++)
            {  p=a[p][cuv[i]-'a'];
            }
            printf("%d\n",i);
         break;
      }
//      afiseaza();
    }
    while(!feof(stdin));
    return 0;
}