#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
int nxt[1000005];
string T,S;
int n;
void getnext(int len){
nxt[0]=-1;
int j=0,k=-1;
while(j<len){
if(k==-1||T[j]==T[k]){
nxt[++j]=++k;
}else{
k=nxt[k];
}
}
}
int kmp(int len,int length){
int cnt=0,j=0;
for(int i=0;i<length;i++){
if(j==len){
cnt++;
}
while(S[i]!=T[j]&&j!=-1){
j=nxt[j];
}
++j;
}
if(j==len){
cnt++;
}
return cnt;
}
int main(){
std::ios::sync_with_stdio(false);
cin>>n;
while(n--){
cin>>T>>S;
if(T=="."){
break;
}
int len=T.length();
int length=S.length();
getnext(len);
int ans=kmp(len,length);
cout<<ans<<endl;
}
return 0;
}
模板积累——KMP算法
最新推荐文章于 2025-07-08 17:20:15 发布