题目链接:http://poj.org/problem?id=3461
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char s1[10005],s2[1000005];
int next[10005];
void getNext(char *p,int *next){
next[0]=-1;
int i=0,k=-1,len;
len=strlen(p);
while(i<len){
if(k==-1 || p[i]==p[k]){
i++;
k++;
next[i]=k;
}
else
k=next[k];
}
}
int Kmp(char *s,char *p,int *next){
getNext(p,next);
int i=0,k=0,ans=0,len1,len2;
len1=strlen(s);
len2=strlen(p);
while(i<len1){
if(k==-1 || s[i]==p[k]){
i++;
k++;
}
else
k=next[k];
if(k==len2){
ans++;
k=next[k];
}
}
return ans;
}
int main(){
int test;
scanf("%d",&test);
while(test--){
scanf("%s",s1);
scanf("%s",s2);
printf("%d\n",Kmp(s2,s1,next));
}
}