链接:

P4555


题意:

在字符串 \(S\) 中找出两个相邻非空回文串,并使它们长度之和最大。


分析:

直接使用马拉车算法求出每个点扩展的回文串。如果枚举两个回文串显然会超时,我们考虑切割一个长串,即枚举切割点,只需枚举每个 \(\#\) 即可,但为了保证两个串都非空,所以最左和最右的 \(\#\) 不能枚举。然后我们需要找到最靠左的回文串中心 \(L\) 使得该回文串包括该点,以及最靠右的回文串中心 \(R\) 使得该回文串包括该点,发现两个回文串长度之和就是 \(R-L\)。同时我们发现当切割点向右移动,\(L\) 的位置是单调增的,当切割点向左移动,\(R\) 的位置是单调减的。所以我们可以双指针维护出每个切割点位置对应的 \(L\) 和 \(R\)。于是就做完了。


代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+5;
string t="@#";int n;
inline void gett(){
char c=getchar();
while(c>'z'||c<'a')c=getchar();
while(c>='a'&&c<='z')t+=c,t+="#",c=getchar();
n=t.length();
}
int hm[N],mr,mid;
inline void match(){
for(int i=1;i<n;i++){
hm[i]=(mr>i)?min(hm[(mid<<1)-i],mr-i):1;
while(t[i+hm[i]]==t[i-hm[i]])hm[i]++;
if(i+hm[i]>mr)mr=i+hm[i],mid=i;
}
}
int ans,now;
int l[N],r[N];
signed main(){
gett();
match();
now=1;
for(int i=1;i<n;i++){
while(i>now+hm[now]-1)now++;
l[i]=now;//最靠左的回文串中心L
}
now=n;
for(int i=n-1;i>=1;i--){
while(i<now-hm[now]+1)now--;
r[i]=now;//最靠右的回文串中心R
}
for(int i=3;i<n-2;i+=2)
ans=max(r[i]-l[i],ans);
cout<<ans;
return 0;
}

洛谷 P4555 [国家集训队]最长双回文串的更多相关文章

  1. 洛谷 P4555 [国家集训队]最长双回文串 解题报告

    P4555 [国家集训队]最长双回文串 题目描述 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为abc,逆序为cba,不相同). 输入长度为\(n\)的串 ...

  2. 洛谷 P4555 [国家集训队]最长双回文串(Manacher)

    题目链接:https://www.luogu.com.cn/problem/P4555 首先明白两个回文串,那么要使两个回文串成立,那么我们只能把$'#'$作为中间节点. 然后我们跑一边Manache ...

  3. 洛谷P4555 [国家集训队]最长双回文串(manacher 线段树)

    题意 题目链接 Sol 我的做法比较naive..首先manacher预处理出以每个位置为中心的回文串的长度.然后枚举一个中间位置,现在要考虑的就是能覆盖到i - 1的回文串中 中心最靠左的,和能覆盖 ...

  4. 【洛谷】P4555 [国家集训队]最长双回文串

    P4555 [国家集训队]最长双回文串 题源:https://www.luogu.com.cn/problem/P4555 原理:Manacher 还真比KMP好理解 解决最长回文串问题 转化为长度为 ...

  5. P4555 [国家集训队]最长双回文串

    P4555 [国家集训队]最长双回文串 manacher 用manacher在处理时顺便把以某点开头/结尾的最长回文串的长度也处理掉. 然后枚举. #include<iostream> # ...

  6. Manacher || P4555 [国家集训队]最长双回文串 || BZOJ 2565: 最长双回文串

    题面:P4555 [国家集训队]最长双回文串 题解:就.就考察马拉车的理解 在原始马拉车的基础上多维护个P[i].Q[i]数组,分别表示以i结尾最长回文子串的长度和以i开头的最长回文子串的长度 然后就 ...

  7. P4555 [国家集训队]最长双回文串(回文树)

    题目描述 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为abc,逆序为cba,不相同). 输入长度为 n 的串 S ,求 S 的最长双回文子串 T ,即可 ...

  8. BZOJ.2565.[国家集训队]最长双回文串(Manacher/回文树)

    BZOJ 洛谷 求给定串的最长双回文串. \(n\leq10^5\). Manacher: 记\(R_i\)表示以\(i\)位置为结尾的最长回文串长度,\(L_i\)表示以\(i\)开头的最长回文串长 ...

  9. [国家集训队]最长双回文串 manacher

    ---题面--- 题解: 首先有一个直观的想法,如果我们可以求出对于位置i的最长后缀回文串和最长前缀回文串,那么我们枚举分界点然后合并前缀和后缀不就可以得到答案了么? 所以我们的目标就是求出这两个数列 ...

随机推荐

  1. Jmeter系列(25)- 常用逻辑控制器 (4) | Include控制器Include Controller

    认识 Include Controller Include Controller :译为包含控制器,用来添加 Test Fragment(测试片段).具体是什么意思呢,我们先来了解下 Test Fra ...

  2. postgres 基础SQL语句 增删改

    查看已创建的数据库:select datname from pg_database; 查看所有数据库的详细信息:select * from pg_database 创建数据库:create datab ...

  3. ❤️【Android精进之路-03】创建第一个Android应用程序竟然如此简单❤️

    您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦. 本文会重点介绍如何创建第一个Android应用,以及如何使用Android Studio进行调试 干货满满,建议收藏,需要用到时常看看.小伙伴们如 ...

  4. 鸿蒙内核源码分析(信号量篇) | 谁在负责解决任务的同步 | 百篇博客分析OpenHarmony源码 | v29.01

    百篇博客系列篇.本篇为: v29.xx 鸿蒙内核源码分析(信号量篇) | 谁在负责解决任务的同步 | 51.c.h .o 进程通讯相关篇为: v26.xx 鸿蒙内核源码分析(自旋锁篇) | 自旋锁当立 ...

  5. CF891B-Gluttony【构造】

    正题 题目链接:https://www.luogu.com.cn/problem/CF891B 题目大意 给出\(n\)个数字互不相同的一个序列\(a\),求它的一个排列\(b\),使得选出任意一个\ ...

  6. sessionId在小程序中的妙用

    前言:小程序发送短信验证码需要在后台储存生成的code,一次会话应放入session中,请求头部发送sessionId验证为同一session 1.页面一加载就从后台获取sessionId,储存在本地 ...

  7. python-matplotlib学习(1)

    1 import matplotlib.pyplot as plt 2 import numpy as np 3 4 x=np.linspace(-1,1,50) 5 y=2*x+1 6 plt.pl ...

  8. 使用three.js实现炫酷的酸性风格3D页面

    背景 近期学习了 WebGL 和 Three.js 的一些基础知识,于是想结合最近流行的酸性设计风格,装饰一下个人主页,同时总结一些学到的知识.本文内容主要介绍,通过使用 React + three. ...

  9. Flask SSTI利用方式的探索

    Flask SSTI利用方式的探索 一.SSTI简介&环境搭建 ​ 一个统一风格的站点,其大多数页面样式都是一致的,只是每个页面显示的内容各不相同.要是所有的逻辑都放在前端进行,无疑会影响响应 ...

  10. 解决springboot 配置文件未映射静态资源文件 导致shiro拦截静态资源的问题

    ---------------------------------------------------------------------------------------------------- ...