Problem Description
给出一个只由小写英文字符a,b,c…y,z组成的字符串S,求S中最长回文串的长度.
回文就是正反读都是一样的字符串,如aba, abba等Input
输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c…y,z组成的字符串S
两组case之间由空行隔开(该空行不用处理)
字符串长度len <= 110000Output
每一行一个整数x,对应一组case,表示该组case的字符串中所包含的最长回文长度.
Sample Input
aaaa
abab
Sample Output
4
3扩展KMP只能判断前缀或后缀是不是回文,不能判断中间的字串是不是回文!
所以需要用manacher算法:
manacher算法,该算法是专门针对回文子串的算法,其时间复杂度为O(n)。
1) 首先在原来字符串的每两个相邻的字符中间掺入一个分隔符,这个分隔符没有在原串中出现过,一般可以用’#’分割。这样就很巧妙的把奇数长度和偶数长度的回文串统一成奇数长度的新的回文串了。例如:aba变为#a#b#a#, abba变为#a#b#b#a;
2) 然后利用一个辅助数组P[]来记录以每个字符为中心的最长回文串的信息。假定str[]为步骤1执行后构造好的新字符串,P[i]表示以str[i]为中心的最长回文串的长度,即当以str[i]为中心时,以str[i]为第一个字符,向右或者向左延伸p[i]个长度。那么p[i] – 1就是该回文串在原串中的长度,这是因为以str[i]为中心的回文串在新串中长度为2 * p[i] – 1,那么由于新串中的每一个回文子串#个数都比相应的源字符串个数多一个,所以原串中回文长度为(2 * p[i] – 1 - 1) / 2 = p[i] – 1;
3) 求辅助数组P[]的值,我们要利用以前已经求出的结果来计算当前的p[i]的值。利用maxID记录在i之前的回文串中延伸到最右端的位置,同时用ID来记录去的最右端的maxID对应的下标id. 为了防止字符比较越界,我们在新串的第一位前面加了一个特殊的字符’$’.
HDU 3068 最长回文 (manacher模板)
原创
©著作权归作者所有:来自51CTO博客作者wx63db9cf49ed95的原创作品,请联系作者获取转载授权,否则将追究法律责任
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
HDU 3068 最长回文 manacher算法模板
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3068题意:Problem Description给出
manacher hdu #include 字符串 i++ -
【Manacher】 HDOJ 3068 最长回文
Manacher学习资料请看http://acm.uestc.edu.cn/bbs/read.php?tid=4294
HDU #include #define i++