博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
双倍回文(bzoj 2342)
阅读量:4322 次
发布时间:2019-06-06

本文共 1045 字,大约阅读时间需要 3 分钟。

Description

Input

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

 

Output

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

Sample Input

16
ggabaabaabaaball

Sample Output

12

HINT

 

N<=500000

/*    先跑一遍manacher,p[i]表示对称轴为i和i+1之间位置的最长回文串长度的一半,由于只求一种对称情况,所以不用加入无关字符。    枚举x为对称轴,实际上对称轴在x到x+1之间,如果len(x+1,y)*4能更新最后的答案,需要满足y-p[y]<=x且y<=x+p[x]/2,按照y-p[y]排序一下,递推x的时候将符合1式的y插入set,在set中查找x+p[x]/2的前驱更新答案即可。*/#include
#include
#include
#include
#define N 500010#define lon long longusing namespace std;int n,p[N],q[N],ans;char ch[N];set
t;void manacher(){ int mx=0,id; for(int i=1;i<=n;i++){ if(mx>=i) p[i]=min(mx-i,p[id*2-i]); else p[i]=0; while(ch[i+p[i]+1]==ch[i-p[i]]) p[i]++; if(p[i]+i>mx) id=i,mx=p[i]+i; }}bool cmp(int a,int b){ return a-p[a]
::iterator tmp=t.upper_bound(i+p[i]/2); if(tmp!=t.begin()){ ans=max(ans,(*--tmp-i)*4); } } printf("%d",ans); return 0;}

 

转载于:https://www.cnblogs.com/harden/p/6675756.html

你可能感兴趣的文章
【Luogu】P2498拯救小云公主(spfa)
查看>>
如何获取网站icon
查看>>
几种排序写法
查看>>
java 多线程的应用场景
查看>>
dell support
查看>>
[Hive - LanguageManual] Alter Table/Partition/Column
查看>>
可持久化数组
查看>>
去除IDEA报黄色/灰色的重复代码的下划波浪线
查看>>
Linux发送qq、网易邮件服务配置
查看>>
几道面试题
查看>>
【转】使用 WebGL 进行 3D 开发,第 1 部分: WebGL 简介
查看>>
js用正则表达式控制价格输入
查看>>
chromium浏览器开发系列第三篇:chromium源码目录结构
查看>>
java开发操作系统内核:由实模式进入保护模式之32位寻址
查看>>
第五讲:单例模式
查看>>
Python编程语言的起源
查看>>
Azure ARMTemplate模板,VM扩展命令
查看>>
(转)arguments.callee移除AS3匿名函数的侦听
查看>>
onNewIntent调用时机
查看>>
MYSQL GTID使用运维介绍(转)
查看>>