2565: 最长双回文串

Time Limit: 20 Sec  Memory Limit: 256 MB

题目连接

http://www.lydsy.com/JudgeOnline/problem.php?id=2565

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

题意

题解:

马拉车算法先跑一法回文串长度,然后再dp一下,对于每个字符的位置,记录下这个点为左端点的回文串长度,这个点为右端点的回文串长度

对于如何存dp的值,我是暴力的,再加了个小小的剪枝

然后跑一法就好了

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6+7;
char s[maxn];
char str[maxn];
int p[maxn];
int dp1[maxn];
int dp2[maxn];
int l;
void manacher(char s[],int l)
{int i,j,k,ans=0;for(i=1;i<=l;++i)str[i<<1]=s[i],str[(i<<1)+1]='#';str[1]='#';str[l*2+1]='#';str[0]='&';str[l*2+2]='$';l=l*2+1;j=0;for(i=1;i<=l;){while(str[i-j-1]==str[i+j+1])++j;p[i]=j;if(j>ans)ans=j;for(k=1;k<=j&&p[i]-k!=p[i-k];++k)p[i+k]=min(p[i-k],p[i]-k);i+=k;j=max(j-k,0);}
}
int main()
{//test;scanf("%s",s+1);l=strlen(s+1);manacher(s,l);l=l*2+1;for(int i=1;i<=l;i++){for(int j=p[i];j>=1;j--){if(dp1[i+j]>=j)break;dp1[i+j]=j;}for(int j=p[i];j>=1;j--){if(dp2[i-j]>=j)break;dp2[i-j]=j;}}int ans=0;for(int i=1;i<=l-2;i++){if(dp1[i]&&dp2[i])ans=max(ans,dp1[i]+dp2[i]);}cout<<ans<<endl;
}

bzoj 2565: 最长双回文串 manacher算法相关推荐

  1. BZOJ 2565 最长双回文串 Manacher

    题目大意: 定义双回文串G是指一个可以被拆分成两个部分(S和T)的字符串G = S + T, 且S和T都是回文串的串, G自己本身可以不是回文串 给出一个长度为n ( 2 <= n <= ...

  2. BZOJ 2565: 最长双回文串

    2565: 最长双回文串 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 1769  Solved: 895 [Submit][Status][Dis ...

  3. BZOJ 2565 最长双回文串

    回文树 正着反着做一遍回文树即可.然而好久没写回文树了,调了好一会儿.大概把一些细节讲一下. 需要建两个根root1(len = -1)和root2(len = 0),其中root1的pre是自己,r ...

  4. HYSBZ 2565 最长双回文串 (回文树)

    2565: 最长双回文串 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 1377  Solved: 714 [Submit][Status][Dis ...

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

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

  6. HYSBZ - 2565 最长双回文串(回文自动机)

    题目链接:点击查看 题目大意:给出一个字符串 s ,求最长双回文子串,题目规定最长双回文子串 t 可以拆成左右两部分,满足两部分都是回文串 题目分析:一开始读错题了,以为是双回文串本身也需要是回文串, ...

  7. 2565: 最长双回文串

    Description 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为"abc",逆序为"cba",不相同). 输 ...

  8. HYSBZ 2565 最长双回文串

    题意:找到一个最长回文子串,该子串能够分成两长度大于0的部分,每部分都是一个回文串 题解:回文树维护一个以i为起点和终点的最长回文串长度数组即可 #include<bits/stdc++.h&g ...

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

    题解: 首先我们写一个Manacher模板.. 然后我们可以把所有回文串的信息映射到左端点上, 每个点依此维护最长右连接回文串. 然后再顺着扫一遍就出解了. 代码: #include <cstd ...

最新文章

  1. python——迭代器
  2. 出现了奇数次的数字的算法
  3. 优化order by语句
  4. 计算机隐藏用户设置,在开始屏幕(欢迎屏幕、控制面板的用户账户设置)上隐藏用户账户和开机自动登录某个账户...
  5. 学习spring之前必学之反射技术(IOC)(一)
  6. Ajax初体验(一)
  7. 2.图像作为函数 | 图像的量化、大小、类型、位置以及Matlab使用_4
  8. IWorkbook 引入_如果引入国内,你会买单吗?日产全新小型SUV亮相|小型suv|日产|轩逸|新车|本田|丰田...
  9. 算法导论-15.5-4
  10. 零基础学python书籍-0基础学python,有什么教程或者书可以推荐吗?
  11. 监听input框值得改变
  12. 开启A20线(部分译)
  13. PHP倒序后五个字符串,并显示
  14. 解决idea下tomcat乱码
  15. 安装ipython_linux安装IPython四种方法
  16. Java实现微信红包随机金额算法
  17. 【CUDA学习笔记】4.锁页内存(pinned memory or page locked memory)
  18. rip路由协议java_路由协议之RIP
  19. 判断司机是否酒后驾车
  20. CAD怎么添加打印机设备?CAD打印机添加步骤

热门文章

  1. Android----PopupWindow
  2. 高并发场景下数据库的常见问题及解决方案
  3. Swift 使用CoreLocation获取定位与位置信息
  4. End Credits
  5. Elam的git笔记:(二)git的安装与基本操作介绍
  6. 丢失/root目录导致命令行-bash-4.1#,解决方法
  7. ubuntu 14.04 下通过apt-get 安装jdk
  8. iOS-UIViewController视图控制器跳转界面的几种常用方法
  9. 使用getopt处理shell脚本的参数
  10. win7关于IIS发布网站时候数据库的问题,xp也一样