注释部分为自己写的kmp,TLE了,没有优化
#include<cstdio>
#include<string.h>
using namespace std;
char P[10010],S[1000010];
int tms[10010];
int pLen,sLen;
int kmp(){
/*
int tot=0,j=0;
for(int i=0;i<sLen;){
if(j==pLen-1 && S[i]==P[j]){
tot++;
j=tms[j];
}
if(S[i]==P[j]){
j++;
i++;
}
else{
j=tms[j];
if(j==-1){
i++;
j=0;
}
}
}*/
int tot=0;
for(int i=0,j=0;i<sLen;i++){
while(j && S[i]!=P[j]) j=tms[j-1];
if(S[i]==P[j]) j++;
if(j==pLen){
tot++;
j=tms[j-1];
}
}
return tot;
}
void tms_cal(){
/*
tms[0]=0,tms[1]=0;
int lc=0;
for(int i=1;i<pLen;){
if(P[i]==P[lc]){
lc++;
tms[i+1]=lc;
i++;
}
else{
if(lc>0) lc=tms[lc-1+1];
else tms[1+i++]=lc;
}
}
tms[0]=-1;*/
tms[0]=0;
for(int i=1,j=0;i<pLen;i++){
while(j&&P[i]!=P[j])
j=tms[j-1];
if(P[i]==P[j]) j++;
tms[i]=j;
}
}
int main(void){
int G;
scanf("%d",&G);
while(G--){
scanf("%s",P);
scanf("%s",S);
pLen=strlen(P);
sLen=strlen(S);
tms_cal();
int tot=kmp();
printf("%d\n",tot);
}
return 0;
}