看了c_cloud的【经典算法】——KMP,深入讲解next数组的求解:http://www.cnblogs.com/c-cloud/p/3224788.html,谢谢大牛的博客,使我对kmp有了更深的了解。。。
#include<stdio.h>
#include<string.h>
void makeNext(const char P[],int next[])
{
int q,k;
int m=strlen(P);
next[0]=0;
for(q=1,k=0;q<m;++q)
{
while(k>0&&P[q]!=P[k])
k=next[k-1];
if(P[q]==P[k])
k++;
next[q]=k;
}
}
int kmp(const char T[],const char P[],int next[])
{
int n,m;
int i,q;
n=strlen(T);
m=strlen(P);
makeNext(P,next);
int ans=0;
for(i=0,q=0;i<n;++i)
{
while(q>0&&P[q]!=T[i])
q = next[q-1];
if(P[q]==T[i])
q++;
if (q==m)
{
q=0;
ans++;
}
}
printf("%d\n",ans);
return 0;
}
int main()
{
int i;
char a[1005],b[1005];
while(scanf("%s",a)&&a[0]!='#')
{
scanf("%s",b);
int next[1005]={0};
kmp(a,b,next);
}
return 0;
}