PAT (Top Level) Practice 1005 Programming Pattern (35)(35 分)

本文提供了一个使用单哈希算法解决字符串匹配问题的C++代码示例。该代码实现了通过快速幂运算预处理哈希值,并利用滚动哈希进行子串查找,最终输出出现次数最多的子串及其出现次数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先贴一个作弊单哈希AC的代码哈哈哈哈哈。

#include <bits/stdc++.h>
using namespace std;
#define N (int)2e6
typedef long long ll;
ll p1, p2;
ll mod[2] = {10000007, 1000000009};
int m[10000100];
const int seed = 131;
string str;
map<pair<ll, ll>, int> mp;
ll qpow(ll a, ll b, ll m)
{
	ll ret = 1;
	while (b)
	{
		if (b & 1) ret = ret*a%m;
		b >>= 1;
		a = a*a%m;
	}
	return ret;
}
int main(void)
{
	
	int n;
	scanf("%d", &n); getchar();
	getline(cin, str);
	str = ' '+str;
	int i, j;
	p1 = qpow(seed, n-1, mod[0]);
	p2 = qpow(seed, n-1, mod[1]);
	ll tmp = 0;
	for (i = 1; i <= n; i++)
	{
		tmp = (tmp*seed+str[i]) % mod[0];
	}

	ll temp = tmp;
	int ma = -1, res;
	if (++m[temp] > ma)
	{
		ma = m[temp];
		res = 1;
	}
	for (i = 2; i <= str.size()-n+1; i++)
	{
		temp = (1ll * (temp - str[i-1]*p1+str[i-1]*mod[0])%mod[0] * seed + str[i+n-1])%mod[0];
	//	ll temp2 = (1ll * (temp.second - str[i-1]*p2+mod[1])%mod[1] * seed + str[i+n-1])%mod[1];
	//	temp = make_pair(temp1, temp2);
		//ll w = ++mp[temp];
		if (++m[temp] > ma)
		{
			ma = m[temp];
			res = i;
		}
		else if (m[temp] == ma)
		{
			if (str.size() < 1e5)if (str.substr(res, n) > str.substr(i, n)) res = i;
		}
	}
	for (i = res; i < res+n; i++)
	{
		printf("%c", str[i]);
	}
	printf(" %d", ma); 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值