#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 1000005
int next[N],len1,len2,ans;
char s1[N],s2[N];
void getnext(){
int k,j;
len1=strlen(s1);
next[0]=-1;
j=0;
k=-1;
while(j<len1){
if(k==-1||s1[k]==s1[j]){
k++;
j++;
next[j]=k;
}
else
k=next[k];
}
return ;
}
int kmp(){
int j,k,cnt;
len2=strlen(s2);
j=k=0;
cnt=1;
getnext();
while(j<len2&&k<len1){
if(k==-1||s2[j]==s1[k]){
j++;
k++;
}
else
k=next[k];
if(k==len1){
ans++;
k=next[k];
}
}
return ans;
}
int main(){
int i,j,k;
scanf("%d",&k);
while(k--){
ans=0;
scanf("%s%s",s1,s2);
kmp();
printf("%d\n",ans);
}
return 0;
}
简单的KMP
就是查看第一个字符串在第二个字符串中出现的次数。