首页 > 其他 > 详细

HDU - 3068 最长回文

时间:2015-05-13 12:59:51      阅读:276      评论:0      收藏:0      [点我收藏+]



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

解题思路:Manacher算法


#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

char S[110005], str[220010];
int len, p[220010];

void init() {
    len = strlen(S);
    str[0] = ‘$‘;
    str[1] = ‘#‘;
    for (int i = 0; i < len; i++) {
        str[2 * i + 2] = S[i]; 
        str[2 * i + 3] = ‘#‘;
    }
    len = 2 * len + 2;
    str[len] = 0;
}

int solve() {
    int MAX = 0, id = 0, ans = 1;
    for (int i = 1; i < len; i++) {
        if (MAX > i) 
            p[i] = min(p[2 * id - i], MAX - i);
        else
            p[i] = 1;

        while (str[i + p[i]] == str[i - p[i]])
            p[i]++;

        if (i + p[i] > MAX) {
            MAX = i + p[i];
            id = i;
        }

        ans = max(ans, p[i]);
    }

    return ans - 1;
}

int main() {
    while (scanf("%s", S) != EOF) {
        init();
        printf("%d\n", solve());
    }
    return 0;
}

HDU - 3068 最长回文

原文:http://blog.csdn.net/kl28978113/article/details/45689957

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!