Manncher算法

Posted jionkitten

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Manncher算法相关的知识,希望对你有一定的参考价值。

题源:https://vjudge.net/problem/UVA-11475

很标准的回文串问题(为什么总是在一些奇奇怪怪的地方写错。。)

#include <iostream>
#include <stdio.h>
#include <cstring>
#define LCOAL
#define maxn 100005
using namespace std;
char s[maxn], ma[maxn << 1];
int mp[maxn << 1]; //注意开双倍

//参考oiwiki上的代码
int Manacher(char s[])
{
    int mal = 0; ma[mal++] = #; //首位为#
    int len = strlen(s);
    for (int i = 0; i < len; ++i)
        ma[mal++] = s[i], ma[mal++] = #;
    mp[0] = 0;
    for (int i = 1, l = 0, r = -1; i < mal; ++i)
    {
        mp[i] = i > r ? 1 : min(mp[l + r - i], r - i);
        while (i - mp[i] >= 0 && i + mp[i] < mal && ma[i - mp[i]] == ma[i + mp[i]])
            mp[i]++;
        if (i + mp[i] == mal) return i - mp[i];
        if (i + mp[i] > r) 
        {
            l = i - mp[i];
            r = i + mp[i];
        }
    }
}

int main()
{
    int t;
    while (~scanf("%s", s))
    {
        printf("%s", s);
        t = Manacher(s);
        for (int i = t; i > 0; --i)
        {
            if (ma[i] != #) putchar(ma[i]);
        }
        putchar(
);
    }
}

以上是关于Manncher算法的主要内容,如果未能解决你的问题,请参考以下文章

有人可以解释啥是 SVN 平分算法吗?理论上和通过代码片段[重复]

片段(Java) | 机试题+算法思路+考点+代码解析 2023

如何标记从卷积神经网络的分割算法生成的图像片段?

从搜索文档中查找最小片段的算法?

C语言100个经典算法源码片段

一致性哈希算法PHP测试片段