bzoj2565最大双回文串
来源:互联网 发布:淘宝联盟怎么做高佣 编辑:程序博客网 时间:2024/06/05 23:57
Description
顺序和逆序读起来完全一样的串叫做回文串。比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同)。
输入长度为n的串S,求S的最长双回文子串T,即可将T分为两部分X,Y,(|X|,|Y|≥1)且X和Y都是回文串。
输入长度为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两部分,且两者都是回文串。
数据规模及限制
对于10%的数据,2≤|S|≤103。
对于30%的数据,2≤|S|≤104。
对于100%的数据,2≤|S|≤105。
昨天看了stringoier的论文,学习了manacher的算法,这个算法的神奇之处在于避免了许多不必要的 操作。而这一题恰巧也灵活的使用了这个算法的思想。我最初的思想是
搞一个lef数组记录以当前点为结尾的最长回文串,rig数组记录以当前点为开头的最长回文串,时间复杂度O(n*n)
代码如下
for
(i=1;i<len;i++)
{
for
(j=i;j<i+r[i];j++)
{
temp=j-i+1;
if
(temp>left[j])
left[j]=temp;
}
for
(j=i;j>i-r[i];j--)
{
temp=i-j+1;
if
(temp>rig[j])
rig[j]=temp;
}
}
for
(i=1;i<len-1;i++)
if
(left[i]+rig[i+1]-1>ans)
ans=left[i]+rig[i+1]-1;
代码如下
for
(i=1,j=3;i<len;i++)
for
(;j<i+r[i];j++)
// if(b[j]=='#')
c[j]=j-i;
for
(i=len-1,j=len-2;i>=1;i--)
for
(;j>=i-r[i]+1;j--)
if
(c[j])
c[j]+=i-j;
for
(i=1;i<len;i++)
if
(c[i]>ans)
ans=c[i];
0 0
- bzoj2565最大双回文串
- bzoj2565: 最长双回文串
- bzoj2565 最长双回文串
- 【BZOJ2565】最长双回文串
- bzoj2565 最长双回文串
- bzoj2565 最长双回文串
- 【bzoj2565】最长双回文串
- Bzoj2565:最长双回文串:回文自动机
- 【BZOJ2565】最长双回文串 Manacher
- 【bzoj2565】最长双回文串 manacher
- bzoj2565 最长双回文串 manacher
- [bzoj2565]最长双回文子串
- BZOJ2565: 最长双回文串 manacher算法
- bzoj2565: 最长双回文串 manacher
- [BZOJ2565]最长双回文串(manacher)
- [BZOJ2565]最长双回文串(manacher)
- [bzoj2565]最长双回文串 manacher
- [bzoj2565][manacher][DP]最长双回文串
- Java 的 ClASSPATH 和 Package
- hdu 1869
- hdu2565 放大X
- 小明A+B(杭电2096)
- HDU 3491 Thieves | 最小割
- bzoj2565最大双回文串
- 822 画图
- NSMutableString字符串删除最后一个字符串
- SAP Mobile Documents 资料收集
- hdu 1098
- Oracle中使用alter table来增加,删除,修改列的语法
- 824 Greedy Mouse
- Uva 12723 期望
- Algorithm Gossip: 费式数列