浅谈Manacher马拉车

本文深入解析了Manacher算法,一种高效求解最长回文子串问题的算法,时间复杂度达到O(n)。通过预处理字符串,算法巧妙地利用回文串的对称性质,避免了重复计算,实现了线性时间内的最优解。文章详细介绍了算法的实现步骤,包括如何通过添加特殊字符简化回文串的处理,以及如何确定回文中心和边界,最终找到最长回文子串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用途

解决最长回文子串

时间复杂度

O(n)

预处理

每一个字符左右加上特殊字符:简化奇偶回文串,使其处理方法相同。
最开始加上另一种特殊字符:避免算回文起始位置的时候下标为负。

符号含义

arr[] 预处理后数组
p[i] 以arr[i] 为中心的最长回文半径
right 之前处理的回文串最右到达的位置
mid right对应的回文中心
i 当前处理的回文中心
j i关于mid对称点 j = mid * 2 - i
ind 最长回文子串的回文中心
// left right关于mid对称点

过程

X回文:以x为中心的回文子串
第一种情况:J回文包含在mid回文里面。由于I, J关于mid对称,所以I回文长度与J回文长度一致。
第二种情况:J回文左端点小于left。则对于I回文,超出right的字符未知,采用暴力的方法。I回文长度从right - i开始暴力更新,之后更新mid和right。

结果

最大回文子串长度maxlen = max(p[ind] - 1);
起始下标index = ( ind - p[ind] ) / 2;

代码

//hdu 3068
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1.2e5 + 7;

char s[maxn];
int maxlen;
int index;
void Manacher()
{
    int p[2 * maxn + 2];
    char arr[2 * maxn + 2];
    int mid = 1, right = 1;
    int ind = 0;

    int len = strlen(s);
    for(int i = len; i >= 1; i --)
    {
        arr[i * 2 + 1] = '#';
        arr[i * 2] = s[i - 1];
    }
    arr[1] = '#';
    arr[0] = '$';

    int lens = len * 2 + 2;
    for(int i = 2; i < lens; i ++)
    {
        if(i < right)
        {
            p[i] = min(p[2 * mid - i], right - i);
        }
        else
            p[i] = 1;
        while(i - p[i] > 0 && i + p[i] < lens && arr[i + p[i]] == arr[i - p[i]])
            p[i] ++;
        if(i + p[i] > right)
        {
            mid = i;
            right = i + p[i];
        }
        if(p[i] > p[ind])
            ind = i;
    }
    maxlen = p[ind] - 1;
    index = (ind - p[ind]) / 2;

}
int main()
{
    while(scanf("%s", s)!= EOF )
    {
        Manacher();
        cout<<maxlen<<endl;
        for(int i = index; i < index + maxlen; i ++)
            cout<<s[i];
            cout<<endl;

    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值