回文子串的最大长度(二分+Hash)

该博客介绍了如何利用二分查找配合哈希算法求解找到给定字符串中最长的回文子串的长度。通过计算前缀和与后缀和,确定正反字符串,然后在字符串长度的奇偶性基础上进行二分搜索,找到满足条件的最长回文串长度。文中提到,马拉车算法可能是更优的选择,但具体实现细节已忘记。

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

在这里插入图片描述

题意:

题面意思

思路:

上一道兔子兔子的题目,我们知道判断两个字符串是否相等,可以使用字符串哈希,也就是将字符串算成P进制数值,然后区间和判断即可,那么这道题目我们需要一个正的字符串,还需要一个反的字符串,然后如果正字符串等于反的字符串之所以要这么做,因为我们是要回文串所以我们需要将回文拆解成为一个正字符串和一个反字符串,这样才好处理这道题目.
既然如此,我们可以算出一个前缀和,再算出一个后缀和,然后就可以知道,正字符串和一个反字符串.字符串的哈希值就是这个区间的哈希值和.
算完之后,我们当前就只需要枚举一个mid中间点,因为所有回文串都是有一个中间点(奇),或者中间区间(偶),然后二分分别寻找这个字符串长度即可,记住不是回文串,回文串的长度,是 字符串长度×2 + 1(奇) 或者是 字符串长度×2(偶数).
感觉马拉车更好,不记得了逃

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
const int N = 1e6+10;
const int Mod = 131;
char s[N];
ull f1[N],f2[N],p[N];
int ans,t,l,r,mid;
ull Hash1(int i,int j) {
   
   //正字符串的哈希值
    return (f1[j]-f1[i-1]*p[j-i+1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值