【模板记录】字符串哈希判断回文串

浙江省赛 第I题Barbecue

浙江省赛的第I题Barbecue,用字符串哈希做。

哈希判断回文串:算一个字符串正着过去的哈希值,再算字符串反过来的哈希值。再比较正反字符串的哈希值,相等就说明回文。

参考博客:I. Barbecue_giao源的博客-CSDN博客

字符串 hash 算法求解回文串 - SegmentFault 思否

贴一下下面的代码,以后碰到相同的题目当作模板来用。(其实写了好几种哈希方法和比较,但是这种相对来说最好理解)

#include <iostream>
#include <string>
using namespace std;
typedef unsigned long long ull;
#define  base 2333
const ull  N = 1e6 + 5;
ull hash1[N];
ull hash2[N];
ull prev_t[N];
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int n, q;
	cin >> n >> q;
	string str;
	cin >> str;
	int len = str.size();
	prev_t[0] = 1;
	hash1[0] = 0;
	hash2[0] = 0;
	for (int i = 1; i <= len; i++)//字符串下标为i对应哈希数组的i+1
	{
		hash1[i] = hash1[i - 1] * base + str[i - 1] - 'a' + 1;
		hash2[i] = hash2[i - 1] * base + str[len - i] - 'a' + 1;//反过来的字符串的哈希值
		prev_t[i] = prev_t[i - 1] * base;//数组在拿到子串的哈希值时起作用
	}
	while (q--)
	{
		int l, r;
		cin >> l >> r;
		int str_lr = r - l + 1;
		if (str_lr % 2 == 0)
		{
			cout << "Budada\n" ;
		}
		else if ((hash1[r] - hash1[l - 1] * prev_t[r - l + 1]) ==
			hash2[len - l + 1] - hash2[len - r] * prev_t[r - l + 1])//比较一下
		{
			cout << "Budada\n";
		}
		else
		{
			cout << "Putata\n";
		}
	}
	return 0;
}

image-20220714171746667
image-20220714171846323

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喜欢乙醇的四氯化碳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值