2342: [Shoi2011]双倍回文

Time Limit: 10 Sec  Memory Limit: 128 MB

Description

Input

输入分为两行,第一行为一个整数,表示字符串的长度,第二行有个连续的小写的英文字符,表示字符串的内容。

Output

输出文件只有一行,即:输入数据中字符串的最长双倍回文子串的长度,如果双倍回文子串不存在,则输出0。

Sample Input

16
ggabaabaabaaball

Sample Output

12

HINT

N<=500000

Source

首先我们manacher处理出每个位置的最长回文串

然后我们枚举对称轴,根据题意可以知道对称轴一定在两个字符中间(即"#"处)

并对于每边分别枚举对称轴,判断是否合法

#include<map>
#include<cmath>
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
#define N 1000100
int n,mx,md,p[N],ans;
char c[N],s[N];
int main()
{
scanf("%d%s",&n,s+);c[]='*';
for(int i=;i<=n;i++){c[(i<<)-]='#';c[i<<]=s[i];}
n<<=;c[++n]='#';c[++n]='!';
for(int i=;i<n;i++)
{
p[i]=mx>i?min(p[(md<<)-i],mx-i):;
while(c[i-p[i]]==c[i+p[i]]) p[i]++;
if(p[i]+i>mx) mx=p[i]+i,md=i;
}
for(int i=;i<n;i+=)
{
int j=p[i]>>;if(j&) j--;
for(;j&&j*>ans;j-=)
if(p[i-j]>j&&p[i+j]>j) ans=max(ans,j<<);
}
printf("%d\n",ans);
return ;
}

最新文章

  1. Linux学习 :按键信号 之 异步通知
  2. 《转》Spring4 Freemarker框架搭建学习
  3. Install .NET Framework 4.5.2 on a Cloud Service Role
  4. Asp.net项目因Session阻塞导致页面打开速度变慢
  5. java 通过zxing生成二维码
  6. BZOJ 2300 防线修建
  7. 实战Windows 7的Windows Media Center
  8. 开发一个微信小程序项目教程
  9. 原创:LoadTest系列之参数时,设置提取参数的方式
  10. JavaScript中常用的正则表达式日常整理(全)
  11. 全栈开发之HTML快速入门(一)
  12. JAVA截取字符串的几种方式
  13. MATLAB-离散系统的数字PID控制仿真
  14. Mysql err 1055
  15. pandas数据结构之series操作
  16. dede 相关推荐调用
  17. [daily][centos][sudo] sudo 报错
  18. obv15 实例6:如果K线柱过多,ZIG将发生变动,导致明显的OBV15指标被隐藏!
  19. adobe
  20. 机器学习进阶-图像形态学操作-膨胀操作 1.cv2.dilate(进行膨胀操作)

热门文章

  1. JavaScript 使用闭包保护变量 防止污染
  2. 向量与矩阵的范数及其在matlab中的用法(norm)
  3. 黑色的企业网站后台管理模板html源码
  4. IE9 下 ellipsis bug fix
  5. defer用途
  6. 浅谈iOS多线程
  7. .pnts点云
  8. vue 条件渲染与列表渲染
  9. Lab 4 in Tornado
  10. python使用smtplib库和smtp.qq.com邮件服务器发送邮件