cumtoj2317(字符串哈希)

该博客探讨了一种基于哈希函数的字符串匹配算法,通过预处理字符串p的哈希值并利用Rolling Hash解决子串查找中的哈希碰撞问题。在主程序中,博主计算了字符串s中所有长度为k的子串的哈希值,并统计了它们出现的频率。接着,博主计算字符串p中所有长度为k的子串的哈希值,对于每个子串,检查它在s中出现的次数,从而更新答案。最后输出了匹配的子串数量。此算法适用于大规模文本处理和搜索场景。
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
using namespace std;
const int N=1e5+10,P=131;
string p,s;
map<ull,int> mp;
map<ull,int> st;
ll ans=0;
ull h1[N],p1[N];
ull get(int l,int r){
	return h1[r]-h1[l-1]*p1[r-l+1];
}
int main(){
	p1[0]=1;
	int k;cin>>k;
	cin>>p;
	cin>>s;
	int m=p.length();
	int n=s.length();
	s="#"+s;p="#"+p;
	for(int i=1;i<=n;i++){
		h1[i]=h1[i-1]*P+s[i];
		p1[i]=p1[i-1]*P;
	}
	for(int i=1;i+k-1<=n;i++){
		mp[get(i,i+k-1)]++;
	}
	for(int i=1;i<=m;i++){
		h1[i]=h1[i-1]*P+p[i];
	}
	for(int i=1;i+k-1<=m;i++){
		ull g=get(i,i+k-1);
		if(!st[g]){
			st[g]++;
			ans+=mp[g];
		}
	}
	cout<<ans<<endl;
	return 0;
}

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值