回文子串【Hash】【二分】

>Link

ybtoj回文子串


>解题思路

寻找回文子串,我们可以从这个子串的中心逐渐向外扩散,如果左边的子串等于右边的子串倒过来,就说明这个子串为回文子串。
所以我们枚举每一个点为中心,二分查找最长的扩散长度,注意这里要处理子串长度为奇数和偶数的不同情况,特殊的,如果长度为偶数,中心点是没有字符的。
如何判断“左边的子串等于右边的子串倒过来”呢?其实直接把这个字符串正过来、倒过来分别做一个哈希就行了

时间复杂度大概为 O ( n l o g n ) O(nlogn) O(nlogn)


>代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 1000010
#define ull unsigned long long
using namespace std;

int C, n, l, r, mid, ans;
ull a[N], hf[N], hb[N];
string s;

void find ()
{
   
	for (int i = 1;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值