果然用按我自己思维写比较轻松,并不是所有都要背的,最好的还是自己写,进而再改进
还有,char字符串从新读入后,是直接被更新的,以前的那些先清空,再 读入后来的
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<iostream>
#define debug(x) cout<<#x<<"="<<x<<endl
using namespace std;
int n,m,ans,f[1090000];
char a[1000090],b[1900009];
int work()
{
scanf("%s",a+1);
scanf("%s",b+1);
a[0]=b[0]='_';
n=strlen(a)-1;
m=strlen(b)-1;
int j=0;
f[1]=ans=0;
for (int i=2;i<=n;i++)
{
while (j>0&&a[j+1]!=a[i])j=f[j];
if (a[j+1]==a[i]) j++;
f[i]=j;
}
j=0;
for (int i=1;i<=m;i++)
{
if (j>0&&b[i]!=a[j+1]) j=f[j];
if (b[i]==a[j+1])j++;
if (j==n) {ans++;j=f[j];}
}
return ans;
}
int main()
{
int T;
scanf("%d",&T);
while (T--) printf("%d\n",work());
return 0;
}