这种字符相同的一般哈希还是好些,毕竟好懂嘛~代码也不长…下面也有注释.这题和那个排序的那个题目基本类似.还是很简单的,第一次在acwing写题解–有点不适应hh
/*
算法:哈希+二分
实现:
for(int i=1;i<=n;i++)//枚举a串的起点.然后二分a串寻找和b串长度最优匹配的,然后cnt一下最长长度
{
}
二分后的长度怎么检测呢?
假定我们已经处理完了h[n],我现在要求l~l+len
*/
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+5;
typedef unsigned long long ull;
int cnt[N],base=131;
ull p[N],h1[N],h2[N];
char s1[N],s2[N];
ull get(int l,int r,ull h[]) { return h[r]-h[l-1]*p[r-l+1]; }
int main()
{
int n,m,q;
cin>>n>>m>>q;
scanf("%s",s1+1);
scanf("%s",s2+1);
p[0]=1;
for(int i=1;i<=n;i++) p[i]=p[i-1]*base;
for(int i=1;i<=n;i++) { h1[i]=h1[i-1]*base+s1[i]-'a';}
for(int i=1;i<=m;i++) { h2[i]=h2[i-1]*base+s2[i]-'a';}
for(int i=1;i<=n;i++)
{
int l=0,r=min(n,m),ans=0;
while(l<=r)
{
int mid=(l+r)>>1;
if(get(i,i+mid,h1)==get(1,mid+1,h2)) { ans=max(ans,mid)+1; l=mid+1; }
else r=mid-1;
}
cnt[ans]++;
}
int x;
while(q--)
{
cin>>x;
cout<<cnt[x]<<endl;
}
return 0;
}
不懂的可以私聊我~