网上KMP讲的很清楚好
http://blog.csdn.net/ts173383201/article/details/7850120
我按着自己的理解写了个模版。
主要参考白书。理解很浅显,先放着。
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
void getFail(char* P,int* f)
{
int m=strlen(P);
f[0]=0;
f[1]=0;
for(int i=1;i<m;i++)
{
int j=f[i];
while(j&&P[i]!=P[j])
j=f[j];
f[i+1]=(P[i]==P[j]?j+1:0);
}
for(int i=0;i<=m;i++)
cout<<f[i]<<endl;
}
int find(char* T,char* P,int* f)
{
int sum=0;
int n=strlen(T),m=strlen(P);
getFail(P,f);//初始化覆盖值
int j=0; // 模式串的指针
for(int i=0;i<n;i++)//文本串当前的指针
{
while(j&&P[j]!=T[i])//如果 当前的文本串的字符与模式的字符不等
j=f[j]; //模式串的指针移到f[j]
if(P[j]==T[i])//当前的文本串的字符与模式的字符相等
j++;
if(j==m)//找到匹配
sum++;
}
return sum;
}
int main()
{
char T[100008],P[100008];
int f[100008];
int i,j;
int ans;
while(cin>>T>>P)
{
memset(f,0,sizeof(f));
ans=find(T,P,f);
cout<<ans<<endl;
}
return 0;
}