首页 > 其他 > 详细

HDU3068 最长回文 Manacher算法

时间:2014-02-23 23:18:26      阅读:659      评论:0      收藏:0      [点我收藏+]

Manacher算法是O(n)求最长回文子串的算法,其原理很多别的博客都有介绍,代码用的是clj模板里的,写的确实是异常的简洁,现在的我只能理解个大概,下面这个网址的介绍比较接近于这个模板,以后再好好理解,我现在先放一放

http://www.starvae.com/?p=212

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#pragma warning(disable:4996)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
 
void palindrome(char cs[], int len[], int n) { //len[i] means the max palindrome length centered i/2
    for (int i = 0; i < n * 2; ++i) {
        len[i] = 0;
    }
    for (int i = 0, j = 0, k; i < n * 2; i += k, j = max(j - k, 0)) {
        while (i - j >= 0 && i + j + 1 < n * 2 && cs[(i - j) / 2] == cs[(i + j + 1) / 2])
            j++;
        len[i] = j;
        for (k = 1; i - k >= 0 && j - k >= 0 && len[i - k] != j - k; k++) {
            len[i + k] = min(len[i - k], j - k);
        }
    }
}
 
char str[120000];
int tlen[240000];
int n;
 
int main()
{
    while (~scanf("%s", str))
    {
        palindrome(str, tlen, strlen(str));
        int ans = 0;
        int mxlen = strlen(str);
        for (int i = 0; i < 2 * mxlen; i++){
            ans = max(ans, tlen[i]);
        }
        printf("%d\n", ans);
    }
    return 0;
}

HDU3068 最长回文 Manacher算法

原文:http://www.cnblogs.com/chanme/p/3561844.html

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