题目:

Description

顺序和逆序读起来完全一样的串叫做回文串。比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同)。输入长度为n的串S,求S的最长双回文子串T,即可将T分为两部分X,Y,(|X|,|Y|≥1)且X和Y都是回文串。

Input

一行由小写英文字母组成的字符串S。

Output

一行一个整数,表示最长双回文子串的长度。

题解:

首先我们有一个结论:(在WC2017被证明)

  • 最长的双倍回文串中一定有一个回文串是不可拓展(最长的)的.

所以我们可以枚举取到最长的那个回文串,然后计算在剩下的字符中最长的回文串

设\(len_i\)表示终止在i上的最长的回文串的长度

那么所有的\(len\)可以使用后缀自动机线性求出.

这时答案就是所有的\(len_i + len_{i - len_i}\)中的最大值.

对吗 ??? ???

并不对,因为这样我们实际上只是默认右面的回文串是极大的.

并没有考虑左面的回文串取到最大值

所以我们还应该把串倒过来再做一次.

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
inline void read(int &x){
x=0;char ch;bool flag = false;
while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
const int maxn = 100010;
struct PAM{
struct Node{
int nx[26];
int len,fail,siz;
Node(){
memset(nx,0,sizeof nx);
len = fail = siz = 0;
}
}T[maxn];
int last,nodecnt,str[maxn],len;
int mx[maxn];
inline void init(){
T[++nodecnt].len = -1;
str[len=0] = -1;
T[0].fail = 1;
}
PAM(){init();}
inline void insert(char cha){
int c = cha - 'a',p,cur,x;str[++len] = c;
for(p = last;str[len - T[p].len - 1] != str[len];p = T[p].fail);
if(T[p].nx[c] == 0){
T[cur = ++ nodecnt].len = T[p].len + 2;
for(x = T[p].fail;str[len - T[x].len - 1] != str[len];x = T[x].fail);
T[cur].fail = T[x].nx[c];T[p].nx[c] = cur;
}T[last = T[p].nx[c]].siz ++ ;
mx[len] = T[last].len;
}
}P1,P2;
char s[maxn];
int main(){
scanf("%s",s+1);int n = strlen(s+1);
for(int i=1;i<=n;++i) P1.insert(s[i]);
for(int i=n;i>=1;--i) P2.insert(s[i]);
int ans = 0;
for(int i=1;i<=n;++i){
ans = max(ans,P1.mx[i] + P1.mx[i - P1.mx[i]]);
ans = max(ans,P2.mx[i] + P2.mx[i - P2.mx[i]]);
}printf("%d\n",ans);
getchar();getchar();
return 0;
}

最新文章

  1. 前端构建工具:gulp的配置与使用
  2. 《Pro Git》笔记1:起步
  3. Ubuntu 下 Neo4j单机安装和集群环境安装
  4. 设计一个简单的,低耗的能够区分红酒和白酒的感知器(sensor)
  5. ###学习《C++ Primer》- 5
  6. NoSQL数据库的四大分类表格分析
  7. 腾讯TT浏览器应用程序发生异常(0xc0000409) 位置为0x027a1f7f 的解决办法
  8. hdoj 5311 Hidden String(KMP)
  9. PAT甲级 1004 树
  10. hdu 5637 BestCoder Round #74 (div.2)
  11. maven使用utf8等
  12. android常犯错误记录(一)
  13. Swift Struct 结构体
  14. 【转载】Xpath定位方法深入探讨及元素定位失败常见情况
  15. PHP语言的优缺点
  16. mysql百万的数据快速创建索引
  17. 关不掉.vbs
  18. 如何在Android平台上使用USB Audio设备
  19. C/C++函数调用方式
  20. 【BZOJ1071】[SCOI2007]组队(神仙题)

热门文章

  1. 为什么是kafka(二)
  2. Android 快速开发系列 ORMLite 框架最佳实践之实现历史记录搜索
  3. python 补充:join() , 基本数据类型的增删改查以及深浅拷贝
  4. 【BZOJ4070】[Apio2015]雅加达的摩天楼 set+最短路
  5. 小米4s经常断网
  6. iOS 微信支付点击左上角返回解决方案
  7. 【python】-- Socket
  8. Linux安装python3.7.2详细操作步骤
  9. 【足迹C++primer】32、定制操作_1
  10. Redis QPS测试