字符串Hash

14 篇文章 0 订阅

1、创建Hash表:

若要hash的是字符则 HASH <char> A;

若要hash的是int则 HASH <int> A;

2、hash a数组初始化(首先要保证a数组是 [0, n) 储存的)

A.init(a, n);

得到的结果是[1,n] 。

3、得到a数组某段区间的hash值

如:想要获得a数组[0,n)的hash值 ,则 A.get(1, n);

想要获得a数组[0,5]的hash值 ,则 A.get(1, 6);


const int N = 200105;

typedef long long ll;
const int MAGIC = 311, MOD = 1e9 + 7;
template <class T>
struct HASH{
	ll h[N], base[N];
	inline void init(T *s, int len) {
		h[0] = 0;
		for (int i = 1; i <= len; ++i) h[i] = (h[i - 1] * MAGIC % MOD + s[i - 1]) % MOD;
		base[0] = 1;
		for (int i = 1; i <= len; ++i) base[i] = (base[i - 1] * MAGIC) % MOD;
	}
	inline long long get(int l, int r) {
		return (h[r] - h[l - 1] * base[r - l + 1] % MOD + MOD) % MOD;
	}
};
HASH <int>A, B;


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值