hdu----(3068)最长回文(manacher)】的更多相关文章

感悟: 首先我要Orz一下qsc,我在网上很难找到关于acm的教学视频,但偶然发现了这个,感觉做的很好,链接:戳戳戳 感觉这种花费自己时间去教别人的人真的很伟大. manacher算法把所有的回文都变成了奇数形式的,所以判断的时候就很方便了,并且p[i]数组存的是:以第i个为中心,他的回文半径是多少.这算法其中还有id和mx,mx是对于一个位置id回文串最长半径是mx.2*id-i是以id为中心关于i对称的那个位置,mx-i是回文串半径长度. 还有qsc推荐的题 POJ 1159 Palindr…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.回文就是正反读都是一样的字符串,如aba, abba等   题目描述:中文题,不翻译. 算法分析:求解最长回文串的长度,当选O(n)的manacher算法. #include<iostream> #include<cstdio> #include<cstdlib> #include&…
最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7317    Accepted Submission(s): 2500 Problem Description 给出一个仅仅由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等   Input 输入…
最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 11553    Accepted Submission(s): 4191 Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.回文就是正反读都是一样的字符串,如aba, abba等   Input 输入有多…
# a # b # b # a # 当我们遇到回判断最长回文字符串问题的时候,若果用暴力的方法来做,就是在字符串中间添加 #,然后遍历每一个字符,找到最长的回文字符串.那么马拉车算法就是在这个基础上进行了改进,我觉得和KMP有点像. 当我们遍历第一个字符串的时候,肯定有一个回文串半径. 设一变量mx为半径达到最右边的下标,id为mx的中心,len为最长半径的长度. 如图所示,i关于id存在对称点2id - i,由于左右关于id对称,所以我们要求i的当前最长回文半径,如果i<mx时候, 以2 *…
下面有别人的比较详细的解题报告: http://wenku.baidu.com/view/3031d2d3360cba1aa811da42.html 下面贴我的代码,注释在代码中: #include <cstdio> #include <cstring> #define N 110005 char a[N]; ]; ]; int min(int a,int b) { return a<b?a:b; } int main() { // freopen("out.cpp…
Manacher算法是个解决Palindrome问题的O(n)算法,能够说是个超级算法了,秒杀其它一切Palindrome解决方式,包含复杂的后缀数组. 网上非常多解释,最好的解析文章当然是Leetcode的了:http://leetcode.com/2011/11/longest-palindromic-substring-part-ii.html 这里总结一下思想重点: 1 原字符串的字符间插入新的字符, 如#,方便统一全部的字符中心,比方aa和aba的字符中心不一样的,aa的字符中心能够说…
HDU - 3068 最长回文 Time Limit: 2000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u Submit Status Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等 Input 输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c...y,z组成的字符串S 两组ca…
题目连接:hdu 3068 最长回文 解题思路:通过manachar算法求最长回文子串,如果用遍历的话绝对超时. #include <stdio.h> #include <string.h> const int N = 220005; int rad[N]; char string[N], tmpstr[N]; int max(int a, int b) { return a > b ? a : b; } int min(int a, int b) { return a &l…
参考博客:Manacher算法--O(n)回文子串算法 - xuanflyer - 博客频道 - CSDN.NET 从队友那里听来的一个算法,O(N)求得每个中心延伸的回文长度.这个算法好像比较偏门,不过还是稍微掌握一下会比较好. 其实,我的理解就是,记录当前知道找到的最长的回文串的中心以及向右延伸后的最右端点位置.然后其中找最长回文串的操作其实还是暴力的,只不过这样记录两个位置以及覆盖了区间以后,下次我们要找的最长回文串的时候就可以借助这个已知信息减少大量的冗余查找.至于怎么证明这个剪枝可以使…