马拉车算法用于解决最长回文字串的一类问题,可以将时间复杂度降低为\(O(n)\),几乎达到了理论上的下界。

核心思想:将分奇偶讨论的情况转化成同一种情况(奇数)。

下面介绍该算法需要用到的几点性质:

  1. \(p[i]\)表示以\(i\)为中心的派生串最长回文半径的长度,则\(p[i]-1\)表示原串中以\(i\)为中心的最长回文子串的长度。

    ​ 证明:在派生串T中,所有回文字串的长度都为奇数,那么对于以\(i\)为中心的最长回文字串,其长度就为\(2*P[i]-1\),经过观察可知,T中所有的回文子串,其中分隔符的数量一定比其他字符的数量多1,也就是有\(P[i]\)个分隔符,剩下\(P[i]-1\)个字符来自原字符串,所以该回文串在原字符串中的长度就为\(P[i]-1\)。

  2. 在计算以添加字符为中心的回文串时,原串的回文长度为偶数,以原串中字符为中心时答案为奇数。

  3. 以 \(id\) 为中心,\(i\)的对称点的坐标公式为\((id<<1)-i\)

  4. 正常回文序列的子回文序列(包括自身)为\((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;
}

最新文章

  1. 架构探险——第二章(为web应用添加业务功能)
  2. Nginx应用案例分享:压力测试
  3. Computer Science Theory for the Information Age-6: 学习理论——VC定理的证明
  4. [原创]git使用入门
  5. 5、Struts2自定义拦截器
  6. python 嵌套字典比较值,取值
  7. k8s 重要概念 - 每天5分钟玩转 Docker 容器技术(117)
  8. Halcon一日一练:图像、变量实时更新
  9. Android--从系统Gallery获取图片
  10. .net mvc 导出excel表格
  11. 腾讯qq发邮件
  12. 自建yum仓库yum源
  13. android linux 休眠 深度睡眠 查看 方法 调试【转】
  14. ASP.NET写的一个博客系统
  15. 【Leetcode】33. Search in Rotated Sorted Array
  16. phpsocketclient以及server样例
  17. Effective Modern C++翻译(2)-条款1:明白模板类型推导
  18. rcp(插件开发) The &#39;Eclipse-LazyStart&#39; header is deprecated, use &#39;Bundle-ActivationPolicy&#39;
  19. android studio安装须知
  20. ov5640 video capture时,vfe_v4l2.ko模块挂掉问题分析

热门文章

  1. jquery中this与$(this)的用法区别
  2. HCL试验4
  3. 【DSP开发】【Linux开发】IIC设备驱动程序
  4. 安装VMWare tools 及安装后/mnt中有hgfs但没共享文件的解决办法
  5. js同步任务和异步任务的执行顺序
  6. 2019牛客暑期多校训练营(第二场)-H Second Large Rectangle(次大子矩阵,降维,直方图+单调栈)
  7. PTA(Basic Level)1006.Sign In and Sign Out
  8. windows vue环境搭建
  9. Python-RabbitMQ-topic(细致消息过滤的广播模式)
  10. Robot Framework(三)项目实践出现的问题以及解决方法