/*********************************************************  
  TD d'Algorithmique IN202 
  ENSTA  
 
  Mardi 12 Decembre 2000   
   
  Pattern-matching: automate de recherche  
   
                                        Guillaume Poupard  
*********************************************************/ 
#include <stdio.h>  
#include <stdlib.h> 
#include <string.h>  
 
int d=2;  
 
int **calcul_automate(char *P)  
{ 
  int m=strlen(P);  
  int **delta; 
  char *Pr;  
  char *Pqx; 
  int i,j,k;  
 
  Pr=(char *)malloc(sizeof(char)*m);  
  Pqx=(char *)malloc(sizeof(char)*m); 
    
  delta=(int **) malloc(sizeof(int *)*m); 
  for(i=0;i<m;i++)  
    delta[i]=(int *) malloc(sizeof(int)*d); 
  for(i=0;i<m;i++)  
    for(j=0;j<d;j++) 
      {  
        strncpy(Pr,P,i+1); 
        Pr[i+1]='\0';
        strncpy(Pqx,P,i); 
        Pqx[i]=j+'a';  
        Pqx[i+1]='\0'; 
        k=i+1;  
        while (strcmp(Pr,Pqx+i+1-k)!=0) 
          {  
            k--; 
            Pr[k]='\0';  
          } 
        printf("delta(%d,%c)=%d\n",i,j+'a',k);  
        delta[i][j]=k; 
      }  
  free(Pr); 
  free(Pqx);  
  return delta; 
}  
     
    
int recherche(int **delta, char *P, char *T) 
{  
  int n=strlen(T); 
  int m=strlen(P);  
  int s; 
  int q=0;  
  for(s=0;s<n;s++) 
    {  
      q=delta[q][T[s]-'a']; 
      if (q==m)  
        return 1; 
    }  
  return 0; 
}  
   
int main(int argc, char * argv[])  
{ 
  int **delta=calcul_automate("aabba");  
  printf("%d\n",recherche(delta,"aabba","ababbabaaabbababbabbbbababa")); 
  printf("%d\n",recherche(delta,"aabba","ababbabaaabababababbbbababa"));  
  exit(0); 
}


syntax highlighted by Code2HTML, v. 0.9.1