KMP算法使用来弥补BF算法的不足(避免不必要的回溯)。避免的方法是由模式串决定(模式串自解),而不是又目标串决定。
http://poj.org/problem?id=3461
#include <stdio.h>
#include <string.h>
#define M 10010
char strSour[M],strTarget[1000010];
int next[M];
int count;
void getNext()
{
int i,j;
int slen=strlen(strSour);
for (j=next[0]=-1,i=1;i<slen;i++)
{
while(j>-1 && strSour[j+1]!=strSour[i]) j=next[j];
if (strSour[j+1]==strSour[i])
{
j++;
}
next[i]=j;
}
}
void kmp()
{
int i=0,j=0;
int slen,tlen;
count=0;
getNext();
slen=strlen(strSour);
tlen=strlen(strTarget);
for (j=-1,i=0;i<tlen;i++)
{
while(j>-1 && strSour[j+1]!=strTarget[i]) j=next[j];
if (strSour[j+1]==strTarget[i])
{
j++;
}
if (j==slen-1)
{
count++;
j=next[j];
}
}
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
scanf("%s%s",strSour,strTarget);
kmp();
printf("%d\n",count);
}
return 0;
}