题目链接:http://poj.org/problem?id=3461
参考:http://blog.csdn.net/u010489766/article/details/9272489
简单的kmp匹配算法
#include<stdio.h>
#include<string.h>
#define Max 10100
int next[Max],n,cnt,len;
char w[Max],t[100*Max];
void getnext()
{
int i = 0 , j = -1;
next[0] = -1;
while(i <= n)
{
if(j == -1 || w[i] == w[j])
{
j++;i++;
next[i] = j;
}
else
j = next[j];
}
}
void kmp()
{
int i = 0 ,j = 0;
while(j < len) //注意,当i=n时,w[i]!=t[j],此时仍然从t[j]与w[next[i]]比较
{
if(i == -1 || w[i] == t[j])
{
i++;
j++;
}
else
i = next[i];
if(i == n)
cnt++;
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
cnt = 0;
memset(w,0,sizeof(w));
memset(t,0,sizeof(t));
memset(next,0,sizeof(next));
scanf("%s",w);
scanf("%s",t);
n = strlen(w);
len = strlen(t);
getnext();
kmp();
printf("%d\n",cnt);
}
return 0;
}