還是KMP,稍微有變形,找到長串中模板串的個數,要注意的一點是可重複匹配,就是說abcdabcdabcd中:abcdabcdabcd abcdabcdabcd
所以這個算兩個。
代碼:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char A[10005];
char B[1000005];
int nxt[10005];
int n,m,t;
int makenext()
{
int l,r;
l=-1;r=0;nxt[0]=-1;
while(r<m){
if(l==-1||A[l]==A[r]){
nxt[++r]=++l;
}else{
l=nxt[l];
}
}
}
int kmp()
{
makenext();
int ans=0;
int ln=0,lm=0;
while(ln<n){
if(lm==-1||B[ln]==A[lm]){
++ln;++lm;
}else{
lm=nxt[lm];
}
if(lm>=m){
++ans;
lm=nxt[lm];
}
}
return ans;
}
int main()
{
// freopen("in.txt","r",stdin);
scanf("%d",&t);
bool dec;
while(t--){
dec=true;
memset(nxt,0,sizeof(nxt));
scanf("%s%s",&A,&B);
n=strlen(B);
m=strlen(A);
printf("%d\n",kmp());
}
return 0;
}