题目大意
统计字符串sr在字符串st中出现次数
代码
被注释的是字符串hash模板
#include<cstdio>
#include<cstring>
#include<algorithm>
#define fr(i,a,b) for(i=a;i<=b;i++)
#define maxn 10000006
using namespace std;
typedef long long ll;
const ll ding=998244353;
int T,i,j,k,lt,lr,cod,ans,p[maxn];
//ll h2,h[maxn],pr[maxn];
char st[maxn],sr[maxn];
/*ll get(int x,int L)
{
return (h[x+L-1]-h[x-1]*pr[L]%ding+ding)%ding;
}
void pre()
{
int i;
pr[0]=1;
fr(i,1,lt)
{
pr[i]=pr[i-1]*29%ding;
h[i]=(h[i-1]*29%ding+st[i]-'a')%ding;
}
return;
}
void pre2()
{
int i;
fr(i,1,lr) h2=(h2*29%ding+sr[i]-'a')%ding;
}*/
int main()
{
freopen("data.in","r",stdin);
scanf("%d",&T);
while (T--)
{
// memset(p,0,sizeof(p));
scanf("%s",sr+1);
scanf("%s",st+1);
lt=strlen(st+1);
lr=strlen(sr+1);
// pre();
// pre2();
ans=j=p[1]=0;
fr(i,2,lr)
{
while (j && sr[i]!=sr[j+1]) j=p[j];
if (st[i]==st[j+1]) ++j;
p[i]=j;
}
j=0;
fr(i,1,lt)
{
while (j && st[i]!=sr[j+1]) j=p[j];
if (st[i]==sr[j+1]) ++j;
if (j==lr)
j=0,++ans;
}
/*i=1;
while (i<=lt-lr+1)
if (get(i,i+lr-1)==h2)
++ans,i+=lr;
*/
printf("%d\n",ans);
}
return 0;
}