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 输入分为两行,第一行为一个整数,表示字符 ...
随机推荐
- ip addr没有ip显示?
重新启动网络 service NetworkManager stop systemctl restart network
- 不会前端也能写官网?没问题,Devbox+Cursor 带你起飞
大家平时都是怎么给自己的产品开发官方网站的? 是不是先在本地配置好环境,然后使用 IDE 写代码,写完代码后部署到服务器生成预览链接,团队协作成员再打开浏览器访问,然后你再修改,再部署,再访问,再修改 ...
- 关于tomcat在idea上的中文编码问题
一.问题引入 在国内,无论是新手还是有一定码龄的开发人员,汉字编码问题一直都是绕不开的魔咒,本文主要对tomcat在jetbrain系列产品idea上的乱码问题提供解决经验. 二.详情描述 新手在初学 ...
- 奇奇怪怪的编程语言:Malbolge
Malbolge 除了我们日常使用的Python.Java.C等主流编程语言外,还存在这么一类极为晦涩难懂的编程语言,被称为深奥的编程语言(Esoteric programming language, ...
- LeetCode题集-7 - 整数反转
题目:给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果.如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0. 假设环境不允许存储 ...
- Three.js案例-360全景房看
在 360° 看房功能中,我们需要在浏览器中创建一个类似虚拟现实的场景,使得用户能够查看环境的每一个角落.这一功能的实现本质上是利用 球体映射技术,即通过将全景图作为纹理贴图映射到一个反向的球体上,用 ...
- docker创建Tomcat
安装docker 查找tomcat docker search tomcat 下载镜像 docker pull tomcat 查看下载的镜像 docker images 运行Tomcat docker ...
- MeteoInfo-Java解析与绘图教程(二)
MeteoInfo-Java解析与绘图教程(二) 上节说到了数据的简单解析,这节则说简单绘图 绘图的前置最重要的就是GridData,有了它,基本可以直接绘制出来 例如我们先放弃简单的自定义绘图的操作 ...
- 配置 Forwarded Headers Middleware
来自微软的说明:Configure ASP.NET Core to work with proxy servers and load balancers | Microsoft Learn. 通过该中 ...
- 源启容器平台KubeGien 打造云原生转型的破浪之舰
云原生是应用上云的标准路径,也是未来发展大的趋势.如何将业务平滑过渡到云上?怎样应对上云期间的各项挑战呢?中电金信基于金融级数字底座"源启"打造了一款非常稳定可靠.多云异构.安 ...