HDU 3068 最长回文(manacher算法:回文字串)
来源:互联网 发布:e4a连接数据库 编辑:程序博客网 时间:2024/06/07 07:59
HDU 3068 最长回文(manacher算法:回文字串)
http://acm.hdu.edu.cn/showproblem.php?pid=3068
题意:给你一个串,求这个串中的最长回文字串的长度.
分析:
利用扩展KMP算法可以很轻松的求出原始串的后缀回文字串长.
详解请见HDU3613解题报告:
http://blog.csdn.net/u013480600/article/details/23041391
这里我们用S的逆T去匹配S,用扩展KMP算法,然后依次查看extend值取最大的extend值即可.extend[i]就是S的以S[i]为起点的回文字串的长度.
仔细一想,发现自己错了,扩展KMP只能判断前缀或后缀是不是回文,不能判断中间的字串是不是回文!
所以需要用manacher算法:
http://blog.csdn.net/u013480600/article/details/23060715
AC代码:
#include <iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>using namespace std;const int MAXN=110000+1000;char S[MAXN*2];//构造的新串char T[MAXN];//原始串int n;int ans;int p[MAXN*2];void init(){ int i,j; S[0]='@',S[1]='#'; for(i=0,j=2;T[i];i++,j+=2) { S[j]=T[i]; S[j+1]='#'; } S[j]=0;}int manacher(){ int ans=0; int id,i,mx=0; for(int i=1;S[i];i++) { if(mx>i) p[i]=min(p[2*id-i] , mx-i); else p[i]=1; while(S[i-p[i]] == S[i+p[i]]) p[i]++; if(i+p[i]>mx) { mx=i+p[i]; id=i; } ans = max(ans,p[i]-1); } return ans;}int main(){ while(scanf("%s",T)==1) { init(); printf("%d\n",manacher()); } return 0;}
0 0
- HDU 3068 最长回文(manacher算法:回文字串)
- 最长回文字串-manacher算法
- 最长回文字串(Manacher算法)
- 最长回文字串--Manacher算法
- 最长回文字串--MANACHER算法
- 最长回文字串Manacher 算法
- hdu 3068 最长回文(最长回文子串 manacher算法)
- Manacher算法 求最长回文字串
- Manacher算法求最长回文字串
- 最长回文字串——Manacher算法
- manacher算法求解最长回文字串
- Hdu 3068 最长回文 (manacher算法)
- hdu 3068 最长回文 (manacher算法)
- HDU 3068 最长回文(Manacher 算法)
- HDU-3068-最长回文 (Manacher算法)
- hdu 3068 最长回文(manacher算法)
- HDU 3068 最长回文 Manacher算法
- hdu 3068 最长回文 manacher算法
- HTTP协议详解
- 【日志】2014_4_6坚持每日一记,哪怕没有技术分享
- iOS应用程序内存调试的代码的分析
- Spring源码学习一_下载Spring项目源码并编译为Eclipse
- 【写给程序员】请不要做浮躁的人
- HDU 3068 最长回文(manacher算法:回文字串)
- php面试题集-数据库技术题
- 使用冒泡排序讲解函数指针
- php面试题集-综合技术题
- JavaScript学习记录——《学用 JavaScript 设计模式》学习笔记(2)单例模式
- php面试题集-前端技术题
- 深度学习(Deep Learning,DL)的相关资料总结
- C与C++混合编程
- 一个较完整的IPhone秒表程序