hdu3068--最长回文(Manacer算法)

最长回文

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 9418    Accepted Submission(s): 3238

Problem Description

给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.

回文就是正反读都是一样的字符串,如aba, abba等

Input

输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c...y,z组成的字符串S

两组case之间由空行隔开(该空行不用处理)

字符串长度len <= 110000

Output

每一行一个整数x,对应一组case,表示该组case的字符串中所包含的最长回文长度.

Sample Input

aaaa

abab

Sample Output

4
3

原字符串的回文串的长度 == p[i]-1

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std ;
#define maxn 310000
int p[maxn] ;
char s[maxn] , str[maxn] ;
int init() {
    int i = 0 , j = 0 , l = strlen(s) ;
    str[j++] = '$' ;
    while( i < l ) {
        str[j++] = '#' ;
        str[j++] = s[i] ;
        i++ ;
    }
    str[j++] = '#' ;
    str[j] = '\0' ;
    return j ;
}
void Manacer(int l) {
    int i , max1 = 0 , id ;
    for(i = 1 ; i < l ; i++) {
        if( max1 > i )
            p[i] = min(p[2*id-i],max1-i) ;
        else
            p[i] = 1 ;
        while( str[i-p[i]] == str[i+p[i]] )
            p[i]++ ;
        if( p[i]+i > max1) {
            max1 = p[i] + i ;
            id = i ;
        }
    }
}
int main() {
    int max1 , i , l ;
    while( scanf("%s", s) != EOF ) {
        l = init() ;
        Manacer(l) ;
        max1 = 0 ;
        for(i = 1 ; i < l ; i++) {
            max1 = max(max1,p[i]) ;
        }
        printf("%d\n", max1-1) ;
    }
    return 0 ;
}
时间: 2024-10-12 04:46:40

hdu3068--最长回文(Manacer算法)的相关文章

hdu3068最长回文(Manacher算法)

简单来说这是个很水的东西.有点dp的思想吧.推荐两个博客,很详细. http://blog.csdn.net/xingyeyongheng/article/details/9310555 http://blog.csdn.net/ggggiqnypgjg/article/details/6645824 然后以为随便学点然后去复习,结果……呵呵.什么鬼数据,两行之间用空行隔开……没看到一直wa半节课…… hdu3068最长回文 var s1,s2:ansistring; s:array[0..10

[hdu3068 最长回文]Manacher算法,O(N)求最长回文子串

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068 题意:求一个字符串的最长回文子串 思路: 枚举子串的两个端点,根据回文串的定义来判断其是否是回文串并更新答案,复杂度O(N3). 枚举回文串的对称轴i,以及回文半径r,由i和r可确定一个子串,然后暴力判断即可.复杂度O(N2). 在上一步的基础上,改进判断子串是否是回文串的算法.记fi(r)=(bool)以i为对称轴半径为r的子串是回文串,fi(r)的值域为{0, 1},显然fi(r)是关于r

[hdu3068]最长回文(Manacher算法)

http://acm.hdu.edu.cn/showproblem.php?pid=3068 题目大意:求最长回文串的长度. 解题关键:Manacher算法 引用一个较好的解释 p[i] = mx > i ? min(p[2 * id - i], mx - i) : 1; 可以这么说,这行要是理解了,那么马拉车算法基本上就没啥问题了,那么这一行代码拆开来看就是 如果mx > i, 则 p[i] = min(p[2 * id - i], mx - i) 否则, p[i] = 1 当 mx - i

HDU3068 最长回文【manacher算法】

最长回文 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 32452 Accepted Submission(s): 11908 Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等 Input 输入有多组case

Manacher&#39;s algorithm: 最长回文子串算法

Manacher 算法是时间.空间复杂度都为 O(n) 的解决 Longest palindromic substring(最长回文子串)的算法.回文串是中心对称的串,比如 'abcba'.'abccba'.那么最长回文子串顾名思义,就是求一个序列中的子串中,最长的回文串.本文最后用 Python 实现算法,为了方便理解,文中出现的数学式也采用 py 的记法. 在 leetcode 上用时间复杂度 O(n**2).空间复杂度 O(1) 的算法做完这道题之后,搜了一下发现有 O(n) 的算法.可惜

hdu-3068 最长回文 【Manacher算法】

Manacher算法学习资料:http://blog.csdn.net/dyx404514/article/details/42061017 最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 9282    Accepted Submission(s): 3194 Problem Description 给出一个只由小写英文字符

【最长回文子串】HDU3068最长回文【Manacher算法】

一张图领悟Manacher算法,计算字符串最长回文子串 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068 Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等 Input 输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c...y,z组成的字符串S 两组case之间由空行隔开(该空行不用处理)

HDU 3068 最长回文 (manacher算法)

最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 9188    Accepted Submission(s): 3159 Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等 Input 输入有多组

hdu--3068 最长回文串(manachar模板)

Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等 Input 输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c...y,z组成的字符串S 两组case之间由空行隔开(该空行不用处理) 字符串长度len <= 110000 Output 每一行一个整数x,对应一组case,表示该组case的字符串中所包含的最长回文长度. Sample Input aaaa