void KMP_MatcherJ(char *T, int nt, char *p, np){
int i,k;
int *x=new int[np+1]; // because p[] begins at index 1
PrefixFun(p, np, x);
k=0;
for(i=1;i<=nt;i++){
while(k>0 && p[k+1]!=T[i])
k=x[k];
if(p[k+1]==T[i]) k++;
if(k==np){
cout<<"matched at position: "<<i-np+1<<endl;
k=x[k];
}
}
}
void PrefixFun(char *p, int n, int *x){
int i,k;
x[1]=0;
k=0;
for(i=2;i<=n;i++){
while(k>0 && p[k+1]!=p[i])
k=x[k];
if(p[k+1]==p[i]) k++;
x[i]=k;
}
}
----------------
indexed from zero:
#include
<
iostream
>
using namespace std;
const int max = 20 ;
int next[max];
void Next( char * p, int n) ... {
int i,k;
k=-1;
next[0]=-1; // next[]里面的值表示匹配到哪个"位置"了
for(i=1;i<n;i++)...{
while(k>-1 && p[i]!=p[k+1]) k=next[k];
if(p[i]==p[k+1])k++;
next[i]=k;
}
}
void KMPMatch( char * str, char * p, int s_len, int p_len) ... {
int i,k;
k=-1;
Next(p,p_len);
for(i=0;i<s_len;i++)...{
while(k>-1 && str[i]!=p[k+1]) k=next[k];
if(str[i]==p[k+1])k++;
if(k==p_len-1)...{
cout<<"occurs at "<<i-p_len+1<<endl;
k=-1;
}
}
}
int main() ... {
char p[]="ababababca";
char str[]="12ababababca2345ababababca";
KMPMatch(str,p,26,10);
return 0;
}
using namespace std;
const int max = 20 ;
int next[max];
void Next( char * p, int n) ... {
int i,k;
k=-1;
next[0]=-1; // next[]里面的值表示匹配到哪个"位置"了
for(i=1;i<n;i++)...{
while(k>-1 && p[i]!=p[k+1]) k=next[k];
if(p[i]==p[k+1])k++;
next[i]=k;
}
}
void KMPMatch( char * str, char * p, int s_len, int p_len) ... {
int i,k;
k=-1;
Next(p,p_len);
for(i=0;i<s_len;i++)...{
while(k>-1 && str[i]!=p[k+1]) k=next[k];
if(str[i]==p[k+1])k++;
if(k==p_len-1)...{
cout<<"occurs at "<<i-p_len+1<<endl;
k=-1;
}
}
}
int main() ... {
char p[]="ababababca";
char str[]="12ababababca2345ababababca";
KMPMatch(str,p,26,10);
return 0;
}