/*********************************************************  
  TD d'Algorithmique IN202   
  ENSTA  
   
  Mardi 12 Decembre 2000   
    
  Pattern-matching: Algorithme de Rabin et Karp  
     
                                        Guillaume Poupard  
*********************************************************/   
#include <stdio.h>  
#include <stdlib.h>   
#include <string.h>  
   
char Texte[]="abbaabbbabaabbb";  
int d=2;   
  
int expo(int a, int b)   
{  
  int p=1;   
  while (b>0)  
    {   
      if ((b%2)==1)  
        p=p*a;   
      a=a*a;  
      b=b/2;   
    }  
  return p;   
}  

int recherche(char *P, char *T)  
{   
  int n=strlen(T);  
  int m=strlen(P);   
  int s;  
  int h=expo(d,m-1);   
  int p=0;  
  int t=0;   
  int j;  
     
  for(j=0;j<m;j++)  
    p+=(P[j]-'a')*expo(d,m-1-j);   
  for(j=0;j<m;j++)  
    t+=(T[j]-'a')*expo(d,m-1-j);   
  
   
  for(s=0;s<=n-m-1;s++)  
    {   
      if (p==t)  
        return 1;   
      t=(t-(T[s]-'a')*h)*d+(T[s+m]-'a'); 
    }  
  if (p==t) 
    return 1;  
  return 0; 
}  
   
  
 
int main(int argc, char * argv[])  
{ 
  printf("%d\n",recherche("baaba",Texte));  
  printf("%d\n",recherche("baba",Texte)); 
  printf("%d\n",recherche("baab",Texte));  
  exit(0); 
}


syntax highlighted by Code2HTML, v. 0.9.1