码迷,mamicode.com
首页 > 编程语言 > 详细

HDU 3068 最长回文(manacher算法)

时间:2015-07-19 20:11:58      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:hdu   最长回文   

题目链接: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之间由空行隔开(该空行不用处理)
字符串长度len <= 110000
 

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

Sample Input
aaaa abab
 

Sample Output
4 3
 

Source

代码如下:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define maxn 200017
int N;
int p[maxn];
char str[maxn], b[maxn];
void init()
{
    int i;
    for(i = 0; str[i]; i ++)
    {
        b[2 * i + 1] = '#', b[2 * i + 2] = str[i];
    }
    N = 2 * i + 1;
    b[0] = '$', b[N] = b[N + 1] = '#';
}
void solve()
{
    int i, id, max = 0, ans = 0;
    for(i = 1; i <= N; i ++)
    {
        p[i] = i < max ? std::min(max - i, p[2 * id - i]) : 1;
        while(b[i + p[i]] == b[i - p[i]]) ++ p[i];
        if(i + p[i] > max) max = i + p[i], id = i;
        if((p[i]-1)>ans) ans=p[i]-1;
    }
    printf("%d\n", ans);
}
int main()
{
    while(~scanf("%s", str))
    {
        init();
        solve();
    }
    return 0;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

HDU 3068 最长回文(manacher算法)

标签:hdu   最长回文   

原文地址:http://blog.csdn.net/u012860063/article/details/46957053

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!