【字符串哈希】CH_1401 兔子与兔子

本文介绍了一种快速判断字符串中两个区间是否相等的算法,通过使用base进制哈希值,能够高效地计算出指定区间的哈希值,并进行比较。此方法适用于需要频繁比较字符串区间相等性的场景。

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

题意

给出一个字符串,判断其中的两个区间是否相等。

思路

f[i]f[i]f[i]为字符串s[1∼i]s[1\sim i]s[1i]basebasebase进制哈希值,则:
f[i]=f[i−1]∗base+s[i]f[i]=f[i-1]*base+s[i]f[i]=f[i1]base+s[i]
取出s[l∼r]s[l\sim r]s[lr]的哈希值为:
f[r]−f[l−1]∗baser−l+1f[r]-f[l-1]*base^{r-l+1}f[r]f[l1]baserl+1
相当于我们把一个l−1l-1l1位的数在后面补满000,然后用f[r]f[r]f[r]减去,得到这一段的结果。

代码

#include<cstdio>
#include<cstring>

char s[1000001];
unsigned long long f[1000001], p[1000001];

int main() {
	scanf("%s", s + 1);
	int m, n = strlen(s + 1);
	p[0] = 1;
	for (int i = 1; i <= n; i++) {
		f[i] = f[i - 1] * 131 + s[i] - 'a' + 1;
		p[i] = p[i - 1] * 131;
	}
	scanf("%d", &m);
	int l1, r1, l2, r2;
	for (; m; m--) {
		scanf("%d %d %d %d", &l1, &r1, &l2, &r2);
		if (f[r1] - f[l1 - 1] * p[r1 - l1 + 1] == f[r2] - f[l2 - 1] * p[r2 - l2 + 1])
			printf("Yes\n");
		else
			printf("No\n");
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值