【BZOJ2565】最长双回文串

Description

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

Input

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

Output

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

Sample Input

baacaabbacabb

Sample Output

12

HINT

样例说明
从第二个字符开始的字符串aacaabbacabb可分为aacaa与bbacabb两部分,且两者都是回文串。
对于100%的数据,2≤|S|≤10^5

题解:网上好多题解都是回文树,回文自动机,感觉没有必要啊!直接上Manacher算法

由于双回文串是将两个回文串拼在一起得到,我们可以枚举中间的'*'点,预处理出以它结尾的最长回文串和以它开头的最长回文串,然后加在一起更新答案。由于求以它结尾的回文串和以它开头的回文串是互部影响的,我这里只说怎么求以它结尾的最长回文串,这里用ls[j]表示。

当我们用Manacher算法求出回文中心i的回文半径rl[i]后,那么在(i,i+rl[i])内的字符都可以用 以i为中心的回文串 来结尾,(就是说以i为中心的回文串能以(i,i+rl[i])内的字符结尾,以(i,i+rl[i])内字符结尾的最长回文串可能以i为中心)

但是我们不能用i一个一个更新以(i,i+rl[i])内的字符结尾的最长回文串长度啊,但是我们发现,以i+rl[i]结尾的回文串长度为rl[i]-1(不算中间的'*'),以i+rl[i]-2结尾的回文串长度自然就是rl[i]-1-2(再说一遍,不算中间的'*')。然后我们只需要从左到右扫一遍,令ls[i]=max(ls[i],ls[i-2]-2)就行啦!

感觉说了这么多也没有直接看代码简单明了

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
char s1[500010],str[1000010];
int n,len,rl[1000010],mx,pos,ls[1000010],rs[1000010],ans;
int main()
{
scanf("%s",s1);
int i;
len=strlen(s1);
for(i=0;i<len;i++) str[n++]='*',str[n++]=s1[i];
str[n++]='*';
for(mx=-1,i=0;i<n;i++)
{
if(mx>i) rl[i]=min(mx-i+1,rl[2*pos-i]);
else rl[i]=1;
for(;i+rl[i]<n&&rl[i]<=i&&str[i+rl[i]]==str[i-rl[i]];rl[i]++);
if(i+rl[i]-1>mx) mx=i+rl[i]-1,pos=i;
rs[i-rl[i]+1]=max(rs[i-rl[i]+1],rl[i]-1);
ls[i+rl[i]-1]=max(ls[i+rl[i]-1],rl[i]-1);
}
for(i=0;i<n;i+=2) rs[i]=max(rs[i],rs[i-2]-2);
for(i=n-1;i>=0;i-=2) ls[i]=max(ls[i],ls[i+2]-2);
for(i=0;i<n;i+=2) if(ls[i]&&rs[i]) ans=max(ans,ls[i]+rs[i]);
printf("%d",ans);
return 0;
}

【BZOJ2565】最长双回文串 Manacher的更多相关文章

  1. BZOJ2565:最长双回文串(Manacher)

    Description 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同). 输入长度为n的串S,求S的最长双回文子串T ...

  2. BZOJ2565最长双回文串——manacher

    题目描述 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同).输入长度为n的串S,求S的最长双回文子串T,即可将T分为两 ...

  3. BZOJ2565 最长双回文串 【Manacher】

    BZOJ2565 最长双回文串 Description 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为"abc",逆序为"c ...

  4. BZOJ 2565: 最长双回文串 [Manacher]

    2565: 最长双回文串 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1842  Solved: 935[Submit][Status][Discu ...

  5. BZOJ.2565.[国家集训队]最长双回文串(Manacher/回文树)

    BZOJ 洛谷 求给定串的最长双回文串. \(n\leq10^5\). Manacher: 记\(R_i\)表示以\(i\)位置为结尾的最长回文串长度,\(L_i\)表示以\(i\)开头的最长回文串长 ...

  6. bzoj 2565: 最长双回文串 manacher算法

    2565: 最长双回文串 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem. ...

  7. [国家集训队]最长双回文串 manacher

    ---题面--- 题解: 首先有一个直观的想法,如果我们可以求出对于位置i的最长后缀回文串和最长前缀回文串,那么我们枚举分界点然后合并前缀和后缀不就可以得到答案了么? 所以我们的目标就是求出这两个数列 ...

  8. 【bzoj2565】最长双回文串 Manacher+树状数组

    原文地址:http://www.cnblogs.com/GXZlegend/p/6802558.html 题目描述 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc ...

  9. BZOJ2565: 最长双回文串(Manacher)

    Description 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同).输入长度为n的串S,求S的最长双回文子串T, ...

随机推荐

  1. Python 列表 list() 方法

    描述 Python 列表 list() 方法用于将可迭代对象(字符串.列表.元祖.字典)转换为列表. 注:元组与列表是非常类似的,区别在于元组的元素值不能修改,元组是放在括号中,列表是放于方括号中. ...

  2. 【转载】Linux 系统时间查看 及 时区修改(自动同步时间)

    1:使用date命令查看时区 [root@db-server ~]# date -R   Sun, 11 Jan 2015 07:10:28 -0800   [root@db-server ~]#   ...

  3. effactive java读书小结1

    java程序设计的原则 1 清晰性和原则性最为重要:模块:任何可重用的软件组件,从单个方法到复杂系统都可以是一个模块.代码应该被重用而不是被拷贝.模块之间的依赖性应该降到最小:错误应尽早检查出来,最好 ...

  4. unity, EventType.MouseUp注意事项

    如果鼠标移出了窗口范围,则即使鼠标抬起也不会收到EventType.MouseUp消息,所以只写 if(event==EventType.MouseUp){ 执行某操作 } 是错误的,会导致非常奇怪的 ...

  5. Qt 积累

    总结(-) 1> 定时器的使用 QTimer *timer = new QTimer(this);  connect(timer, SIGNAL(timeout()), this, SLOT(u ...

  6. Rust 1.7.0 处理命令行參数

    std是 Rust 标准函数库: env 模块提供了处理环境函数. 在使用标准函数库的时候,使用 use 导入对应的 module . 一.直接输出 use std::env; fn main(){ ...

  7. Mac下Selenium无法最大化Chrome解决方案

    在用Selenium做自动化操作时,一般最大化浏览器的代码都是:driver.manage().window().maximize(), 但是在Mac下这样是无法最大化Chrome浏览器的,解决方法: ...

  8. 使用ReaderWriterLock类实现多用户读/单用户写同步

    使用ReaderWriterLock类实现多用户读/单用户写同步[1] 2015-03-12 应用程序在访问资源时是进行读操作,写操作相对较少.为解决这一问题,C#提供了System.Threadin ...

  9. la4730(并查集+树状数组)

    https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=30& ...

  10. eclipse配置xml的自动提示

    如mybatis的mapper配置文件: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE ...