题目链接:https://www.luogu.com.cn/problem/P4555

首先明白两个回文串,那么要使两个回文串成立,那么我们只能把$'#'$作为中间节点。

然后我们跑一边Manacher,记录$l[],r[]$,$l[i]$表示以$i$开头的最长回文串长度,$r[i]$表示以$i$结尾的最长回文串长度。

那么到最后我们只需要用线性的时间来枚举$i$,找$l_i+r_i$最大即可。

但是,在Manacher算法中有局限性:就是我们处理出来的$l,r$都是饱和回文串的,那么我们就要处理不饱和回文串:

$l[i]=max(l[i],l[i-2]-2)$

$r[i]=max(r[i],r[i+2]-2)$

解释一下$1$式,$2$式类似:

其实都是一个递推的过程,l[i-2]即为上一个$‘#’$的位置,$-2$是因为回文串的对称性。

AC代码:

 #include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std; const int N=;
int p[N*],l[N*],r[N*];
char s[N*],str[N];
int ans,t; void manacher(int len){
s[]='$'; s[++t]='#';
for(int i=;i<=len;i++){
s[++t]=str[i];
s[++t]='#';
}
int pos=,mx=;
for(int i=;i<=t;i++){
if(i>mx) p[i]=;
else p[i]=min(p[*pos-i],mx-i);
while(i+p[i]<=t&&i-p[i]>=&&s[i-p[i]]==s[i+p[i]]) p[i]++;
if(i+p[i]>mx){
mx=i+p[i];
pos=i;
}
l[i-p[i]+]=max(l[i-p[i]+],p[i]-);
r[i+p[i]-]=max(r[i+p[i]-],p[i]-);
}
} int main(){
scanf("%s",str+);
manacher(strlen(str+));
for(int i=;i<=t;i+=) l[i]=max(l[i],l[i-]-);
for(int i=t;i>=;i-=) r[i]=max(r[i],r[i+]-);
for(int i=;i<=t;i+=) if(l[i]&&r[i]) ans=max(ans,l[i]+r[i]);
printf("%d\n",ans);
return ;
}

AC代码

最新文章

  1. 数据结构与算法JavaScript (三) 链表
  2. 作业3.2:psp
  3. 【7集iCore3基础视频】7-5 iTool2驱动安装
  4. javascript笔记:流程控制语句
  5. 玩转ubuntu FAQ
  6. WIFI接入Internet配置过程
  7. 支付宝api教程,支付宝根据交易号自动充值
  8. 怎么样把UIImage保存到相册
  9. netty&mdash;&mdash;私有协议栈开发案例
  10. Flask表单(Flask-WTF)
  11. Markdown 编辑器语法 专题
  12. 如何正确可视化RAW(ARW,DNG,raw等格式)图像?
  13. PHP7运行环境搭建(Windows7)
  14. 洛谷P4172 [WC2006]水管局长 (LCT,最小生成树)
  15. python所有基础
  16. pycharm + git 的集成使用
  17. 关于linux下/srv、/var和/tmp的职责区分
  18. 最具有性价比的语言javascript之介绍篇
  19. 嵌入式&#160;探讨父子线程、进程终止顺序不同产生的结果_skdkjxy_新浪博客
  20. MySql 时间处理

热门文章

  1. vue.js父组件引入子组件,父组件向子组件传值
  2. java - synchronized与lock的区别
  3. Wannafly Camp 2020 Day 2J 邦邦的2-SAT模板
  4. &quot;换行&quot;和&quot;回车&quot;的来历
  5. postgresql + omniDB
  6. Alan Walker MV 合辑01 by defender 歌词
  7. C语言移除链表元素
  8. mybatis大于等于小于等于的写法
  9. 强网杯2018 - nextrsa - Writeup
  10. Python爬虫连载4-Error模块、Useragent详解