【模板】manachar
2024-08-29 20:57:09
马拉车算法用于解决最长回文字串的一类问题,可以将时间复杂度降低为\(O(n)\),几乎达到了理论上的下界。
核心思想:将分奇偶讨论的情况转化成同一种情况(奇数)。
下面介绍该算法需要用到的几点性质:
\(p[i]\)表示以\(i\)为中心的派生串最长回文半径的长度,则\(p[i]-1\)表示原串中以\(i\)为中心的最长回文子串的长度。
证明:在派生串T中,所有回文字串的长度都为奇数,那么对于以\(i\)为中心的最长回文字串,其长度就为\(2*P[i]-1\),经过观察可知,T中所有的回文子串,其中分隔符的数量一定比其他字符的数量多1,也就是有\(P[i]\)个分隔符,剩下\(P[i]-1\)个字符来自原字符串,所以该回文串在原字符串中的长度就为\(P[i]-1\)。
在计算以添加字符为中心的回文串时,原串的回文长度为偶数,以原串中字符为中心时答案为奇数。
以 \(id\) 为中心,\(i\)的对称点的坐标公式为\((id<<1)-i\)
正常回文序列的子回文序列(包括自身)为\((p[i]-1)>>1\)
/*
马拉车算法模板
*/
#include <bits/stdc++.h>
using namespace std;
const int maxn=3e7+10;
char s[maxn],str[maxn];
int n,ans,p[maxn];
void init(){
str[0]=str[1]='#';
for(int i=1;i<=n;i++)str[i<<1]=s[i],str[i<<1|1]='#';
n=(n<<1)+2;str[n--]=0;
}
void manachar(){
int id=0,mx=0;
for(int i=1;i<=n;i++){
p[i]=mx>i?min(mx-i,p[(id<<1)-i]):1;
while(str[i+p[i]]==str[i-p[i]])p[i]++;
if(i+p[i]>mx)mx=i+p[i],id=i;
}
}
int main(){
scanf("%s",s+1);
n=strlen(s+1);
init();manachar();
for(int i=1;i<=n;i++)ans=max(ans,p[i]);
printf("%d\n",ans-1);
return 0;
}
最新文章
- 架构探险——第二章(为web应用添加业务功能)
- Nginx应用案例分享:压力测试
- Computer Science Theory for the Information Age-6: 学习理论——VC定理的证明
- [原创]git使用入门
- 5、Struts2自定义拦截器
- python 嵌套字典比较值,取值
- k8s 重要概念 - 每天5分钟玩转 Docker 容器技术(117)
- Halcon一日一练:图像、变量实时更新
- Android--从系统Gallery获取图片
- .net mvc 导出excel表格
- 腾讯qq发邮件
- 自建yum仓库yum源
- android linux 休眠 深度睡眠 查看 方法 调试【转】
- ASP.NET写的一个博客系统
- 【Leetcode】33. Search in Rotated Sorted Array
- phpsocketclient以及server样例
- Effective Modern C++翻译(2)-条款1:明白模板类型推导
- rcp(插件开发) The &#39;Eclipse-LazyStart&#39; header is deprecated, use &#39;Bundle-ActivationPolicy&#39;
- android studio安装须知
- ov5640 video capture时,vfe_v4l2.ko模块挂掉问题分析
热门文章
- jquery中this与$(this)的用法区别
- HCL试验4
- 【DSP开发】【Linux开发】IIC设备驱动程序
- 安装VMWare tools 及安装后/mnt中有hgfs但没共享文件的解决办法
- js同步任务和异步任务的执行顺序
- 2019牛客暑期多校训练营(第二场)-H Second Large Rectangle(次大子矩阵,降维,直方图+单调栈)
- PTA(Basic Level)1006.Sign In and Sign Out
- windows vue环境搭建
- Python-RabbitMQ-topic(细致消息过滤的广播模式)
- Robot Framework(三)项目实践出现的问题以及解决方法