匹配统计----------------------------思维(二分+hash)

在这里插入图片描述
在这里插入图片描述
解析:
把A和B串哈希。然后枚举A串的后缀,然后二分A串和B串匹配的长度即可
时间复杂度O(nlogn)

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
const int N=2e5+10000;
char a[N],b[N];
ull P=131;
ull h1[N],p1[N],h2[N],p2[N];
int n,m,q,x;
int cnt[N];
ull get_h1(int l,int r)
{
	return h1[r]-h1[l-1]*p1[r-l+1];
}
ull get_h2(int l,int r)
{
	return h2[r]-h2[l-1]*p2[r-l+1];
}
int main()
{
	scanf("%d %d %d",&n,&m,&q);
	scanf("%s",a+1);
	scanf("%s",b+1);
	p1[0]=1;
	for(int i=1;i<=n;i++)
	{
		h1[i]=h1[i-1]*P+(a[i]-'a'+1);
		p1[i]=p1[i-1]*P;
	}
	for(int i=1;i<=m;i++)
	{
		h2[i]=h2[i-1]*P+(b[i]-'a'+1);
		p2[i]=p2[i-1]*P;
	}
	for(int i=1;i<=n;i++)
	{
		int l=0,r=n-i+1;
		int ans=0;
		while(l<=r)
		{
			int mid=l+r>>1;
			if(get_h1(i,i+mid-1)==get_h2(1,mid)) l=mid+1,ans=mid;
			else r=mid-1;
		}
		cnt[ans]++;
	}
	while(q--)
	{
		scanf("%d",&x);
		cout<<cnt[x]<<endl;
	}
	
 } 

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读