#include<iostream>
#include<string.h>
int next[100];
void getnext( char b [])
{
int i=1,j=0; //i是每个位置,j是回退的位置
next[1]=0;
while(i<=strlen( b))
{
if(j==0|| b[i-1]==b [j-1])
{
i++;
j++;
next[i]=j;
}
else j=next[j]; //用上一个的 回退关系
}
}
int kmp( char a [],char b[])
{
int i=1,j=1; //i是主串中的位置 ,j匹配串的位置
while(i<=strlen( a)&&j<=strlen(b ))
{
if(j==0|| a[i-1]==b [j-1]) //若相等,继续
{
i++;
j++;
}
else j=next[j]; //从next处开始
}
if(j>strlen( b)) //匹配完成,返回位置
return i-strlen( b);
else return 0;
}
int main()
{
char a[40],b[40];
printf("要匹配的主串:\n");
scanf("%s",a);
printf("要匹配的子串:\n");
scanf("%s",b);
getnext(b);
printf("输出next值:\n");
for(int i=1;i<=strlen(b);i++)
printf("%d ",next[i]);
printf("\n");
printf("%d",kmp(a,b));
system("pause");
main();
return 0;
}