题目:​​http://poj.org/problem?id=3461​

大意是这样的:在一篇没有空格的文章中找到给定的词,统计出现的次数输出。

用KMP求出前缀-后缀编码,将词当做模式串在文章中不断移动寻找相同的词。

#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn1=1e4+5,maxn2=1e6+5;
char s1[maxn1],s2[maxn2];
int snext[maxn1],len;
void getnext(){
int i=0,j=-1;
snext[0]=-1;
while(i<=len){
if(j==-1||s1[i]==s1[j])snext[++i]=++j;
else j=snext[j];
}
}
int main()
{
//freopen("cin.txt","r",stdin);
int t,i,j;
cin>>t;
while(t--){
scanf("%s%s",s1,s2);
len=strlen(s1);
getnext();
int ans=0,length=strlen(s2);
i=0,j=0;
while(i<length){
if(j==-1||s1[j]==s2[i]){
i++;
j++;
}
else j=snext[j];
if(j==len){
ans++;
j=snext[j];
}
}
printf("%d\n",ans);
}
return 0;
}