字符串哈希

本文介绍了一种基于双哈希的字符串匹配算法实现。通过定义两个不同的哈希函数,该算法能够有效地处理字符串的匹配问题,并支持半开区间内的哈希值计算。代码中详细展示了如何初始化哈希表、计算整个字符串的哈希值以及计算子串的哈希值。

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

class XDCHash {
	typedef unsigned long long int ull;
public:
	XDCHash() :m_hashBase(131ull), m_hashMode(998244353ull), m_boInit(false) {}
	XDCHash(ull base, ull mod) :m_hashBase(base), m_hashMode(mod), m_boInit(false) {}
	void Init(int n) {
		P.assign(n + 1, 1);
		for (int i = 0; i < n; i++) {
			P[i + 1] = P[i] * m_hashBase % m_hashMode;
		}
		m_boInit = true;
	}
	ull Hash(string& input) {
		int len = input.size();
		if (!m_boInit)Init(len);

		H.assign(len + 1, 0);
		for (int i = 0; i < len; i++) {
			H[i + 1] = (H[i] * m_hashBase + input[i]) % m_hashMode;
		}
		return H.back();
	}
	ull HashHalf(int l, int r) {
		ull a = H[r + 1];
		ull b = H[l] * P[r - l + 1] % m_hashMode;
		return (a - b + m_hashMode) % m_hashMode;
	}
public:
	vector<ull> P, H;
	bool m_boInit;
	ull m_hashBase, m_hashMode;
};

class XDCHash2 {
	typedef unsigned long long int ull;
public:
	XDCHash2() :h1(131ull, 998244353ull), h2(307, 95911007) {}
	pair<ull, ull> Hash(string& input) {
		return { h1.Hash(input) ,h2.Hash(input) };
	}
	pair<ull, ull> HashHalf(int l, int r) {
		return { h1.HashHalf(l,r) ,h2.HashHalf(l,r) };
	}
private:
	XDCHash h1;
	XDCHash h2;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值