首页 > 其他 > 详细

manecher

时间:2018-02-24 23:54:30      阅读:349      评论:0      收藏:0      [点我收藏+]

 

 

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

char s[100];
int rd[100];

int manecher(char* s) {
    int len = strlen(s);
    for (int i = len - 1; i >= 0; i--) {
        s[i * 2 + 3] = #;
        s[i * 2 + 2] = s[i];
    }
    s[len * 2 + 2] = \0;
    s[1] = #;
    s[0] = $;
    memset(rd, 0, sizeof(rd));
    int right = 0;//右边界
    int cn = 0;//回文串中心
    for (int i = 1; i < 2 * len + 2; i++) {
        if (right > i) {
            rd[i] = min(rd[2 * cn - i], rd[cn] + cn - i);
        } else {
            rd[i] = 1;
        }
        while (s[i + rd[i]] == s[i - rd[i]]) rd[i]++;
        if (right > cn + rd[i]) {
            right = cn + rd[i];
            cn = i;
        }
    }
    int ans = 0;
    for (int i = 1; i < 2 * len + 2; i++) {
        ans = max(ans, rd[i] - 1);
    }
    return ans;

}

int main() {
    scanf("%s", s);
    printf("%d\n", manecher(s));
    return 0;
}

 

manecher

原文:https://www.cnblogs.com/xFANx/p/8467946.html

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