Luogu P4287 SHOI2011 双倍回文 题解 [ 紫 ] [ manacher ]
双倍回文:回文子串结论的经典应用。
结论
先放本题最关键的结论:一个字符串本质不同的回文子串最多只有 \(n\) 个。
考虑如何证明:
假设我们一个一个地在当前字符串(黑色部分)的结尾加入字符(红色部分),那么会出现如下情况:

显然,加入红色字符后,字符串中最多只可能新出现一个本质不同的回文子串。如果这个本质不同的回文子串存在,则这个回文子串就是当前最长的回文子串(深蓝色部分)。
为啥呢,因为假设存在一个更短的回文子串(浅蓝色部分),我们称这个浅蓝色的短回文子串为 \(s\),深蓝色的最长回文子串为 \(t\),则 \(t\) 中一定包含了 \(s\)。而根据回文串的性质,\(s\) 正着读反着读都相同,因此深蓝色的回文串 \(t\) 另一边一定存在另一个 \(s\),且那个 \(s\) 的结尾比当前 \(s\) 的结尾靠前(这两个 \(s\) 在图中用浅蓝色划出来了)。因此它已经被计入本质不同的回文子串中了。
思路
有了这个结论,剩下的就简单了,我们只需要对每个本质不同的回文串判断一下就可以了。
用 manacher 来实现,在每次扩展盒子右端点时统计新拓展部分的回文子串,注意特判细节即可。
因为右端点最多只会拓展 \(n\) 次,所以时间复杂度 \(O(n)\)。
代码
#include <bits/stdc++.h>
#define fi first
#define se second
#define lc (p<<1)
#define rc ((p<<1)|1)
#define eb(x) emplace_back(x)
#define pb(x) push_back(x)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
using pi=pair<int,int>;
int m,n,ans=0,d[1000005];
char a[500005],s[1000005];
void init()
{
n=0;
s[0]='$';
s[++n]='#';
for(int i=1;i<=m;i++)s[++n]=a[i],s[++n]='#';
s[n+1]='&';
}
void manacher()
{
d[1]=1;
for(int i=2,l=0,r=0;i<=n;i++)
{
if(i<=r)d[i]=min(r-i+1,d[l+r-i]);
while(s[i-d[i]]==s[i+d[i]])d[i]++;
if(i+d[i]-1>r)
{
if(s[i]=='#')
{
for(int j=r+1;j<=i+d[i]-1;j++)
{
if(s[j]=='#')continue;
int dxx=(j-i+1)/2,c=i-dxx;
if(d[c]/2>=dxx/2&&s[c]=='#'&&dxx>=1&&dxx*2%4==0)ans=max(ans,dxx*2);
}
}
l=i-d[i]+1,r=i+d[i]-1;
}
}
}
int main()
{
//freopen("sample.in","r",stdin);
//freopen("sample.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>m>>a+1;
init();
manacher();
cout<<ans;
return 0;
}
Luogu P4287 SHOI2011 双倍回文 题解 [ 紫 ] [ manacher ]的更多相关文章
- Manacher || BZOJ 2342: [Shoi2011]双倍回文 || Luogu P4287 [SHOI2011]双倍回文
题面:[SHOI2011]双倍回文 题解:具体实现时,就是在更新mr时维护前半段是回文串的最长回文串就好了 正确性的话,因为到i时如果i+RL[i]-1<=mr,那么答案肯定在i之前就维护过了: ...
- 洛谷 P4287 [SHOI2011]双倍回文题解
前言 用了一种很奇怪的方法来解,即二分判断回文,再进行某些奇怪的优化.因为这个方法很奇怪,所以希望如果有问题能够 hack 一下. 题解 我们发现,这题中要求的是字符串 \(SS'SS'\),其中 \ ...
- P4287 [SHOI2011]双倍回文(回文树)
题目描述 记字符串 w 的倒置为 w^R^ .例如 (abcd)^R^=dcba , (abba)^R^=abba . 对字符串x,如果 x 满足 x^R^=x ,则称之为回文:例如abba是一个回文 ...
- 洛谷P4287 [SHOI2011]双倍回文(回文自动机)
传送门 听说有大佬用manacher$O(n)$过此题……太强啦…… 说一下PAM的做法吧.(看了题解之后发现)蛮简单的 我们肯定要先建出回文自动机的 然后如果是枚举每一个节点暴跳fail指针肯定得T ...
- P4287 [SHOI2011]双倍回文
题意 考虑对每个节点\(x\)维护\(lastpos_x\)表示\(x\)的所有后缀回文串中第一个\(len\leqslant len_x/2\)并且能和\(x\)最后一个字符匹配的,之后枚举节点,判 ...
- [SHOI2011]双倍回文 manacher
题面: 洛谷:[SHOI2011]双倍回文‘ 题解: 首先有一个性质,本质不同的回文串最多O(n)个. 所以我们可以对于每个i,求出以这个i为结尾的最长回文串,然后以此作为长串,并判断把这个长串从中间 ...
- BZOJ2342: [Shoi2011]双倍回文
2342: [Shoi2011]双倍回文 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 923 Solved: 317[Submit][Status ...
- BZOJ 2342: [Shoi2011]双倍回文 马拉车算法/并查集
2342: [Shoi2011]双倍回文 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1123 Solved: 408 题目连接 http://w ...
- 2018.06.30 BZOJ 2342: [Shoi2011]双倍回文(manacher)
2342: [Shoi2011]双倍回文 Time Limit: 10 Sec Memory Limit: 128 MB Description Input 输入分为两行,第一行为一个整数,表示字符串 ...
- bzoj 2342: [Shoi2011]双倍回文 -- manacher
2342: [Shoi2011]双倍回文 Time Limit: 10 Sec Memory Limit: 128 MB Description Input 输入分为两行,第一行为一个整数,表示字符 ...
随机推荐
- 2023-05 多校联合训练 ZJNU站 热身赛
猫猫接币币 给定两个容量分别为a和b的盒子,已知第i秒天上会掉下i个金币,你会从第1秒开始接金币,每秒钟你可以选择任意一个盒子接金币,但是不能不选,你必须使得两个盒子刚好装满,请问是否存在某个时刻,使 ...
- PLC编程—编程语言
LAD:图形编程语言(电路图表示法--梯形图). FBD:图形编程语言(电路系统表示法--功能块图). SCL:结构化编程语言之一. STL:文本编程语言. 常用的指令 位.定时.计数.比较.数学.赋 ...
- 《JavaScript 模式》读书笔记(7)— 设计模式3
这一篇,我们学习本篇中最为复杂的三个设计模式,代理模式.中介者模式以及观察者模式.这三个模式很重要!! 七.代理模式 在代理设计模式中,一个对象充当另一个对象的接口.它与外观模式的区别之处在于,外观模 ...
- ChatGPT自动生成功能测试用例的步骤
在上一节,我们一起探讨了ChatGPT在功能测试用例生成方面的优势.接下来,我们将探讨ChatGPT自动生成功能测试用例的步骤. 1) 问题定义:让ChatGPT自动生成功能测试用例的第一步是清 ...
- WebP图片使用踩坑
前情 WebP是一种同时提供了有损压缩与无损压缩(可逆压缩)的图片文件格式,最初在2010年发布,目标是减少文件大小,相较于传统的 PNG.JPG,甚至是动图 GIF 的格式,WebP 比它们的空间更 ...
- idea配置gradle国内镜像源
项目文件中找到build.gradle文件,修改其中的buildscript和allprojects地址: buildscript { repositories { maven{ url 'http: ...
- Day01 Markdown 学习笔记
Day01 Markdown 学习笔记 1.标题 n级标题 = n个"#" + 空格 + 标题名称 (最多6个) 2.文本 Hello World Hello World ...
- 『玩转Streamlit』--集成Plotly
之前介绍了如何在Streamlit App中使用Matplotlib库来绘图. 本篇介绍 Steamlit结合Poltly的方法,相比于Matplotlib,Poltly的交互性更强, 更适合在Web ...
- 龙哥量化:通达信DRAWICON的图标副图显示效果(鸡肋,可以不看)
新建一个副图指标,复制粘贴源码,先看一下效果图 DRAWTEXT_FIX(1,0.01,0.01,0,'通达信中DRAWICON的图标,方便大家折腾指标'),COLORMAGENTA; A:=CURR ...
- Qt/C++最新地图组件发布/历时半年重构/同时支持各种地图内核/包括百度高德腾讯天地图
一.前言说明 最近花了半年时间,专门重构了整个地图组件,之前写的比较粗糙,有点为了完成功能而做的,没有考虑太多拓展性和易用性.这套地图自检这几年大量的实际项目和用户使用下来,反馈了不少很好的建议和意见 ...