Manacher 入门+模板 回文串专用算法

Manacher 算法 回文串专用算法

manacher 人名,该算法的发明者。palindrome名词:回文。

博客推荐

https://www.cnblogs.com/lykkk/p/10460087.html,比较简洁,代码清晰。

https://www.cnblogs.com/cloudplankroader/p/10988844.html, 一些细节的东西比较讲解比较细。

模板

//预处理函数,使得处理后的字符串长度为奇数,并且有一些比较好的性质
int init(char* s, char* ss)
{
    int len=strlen(s);
    ss[0]='@'; ss[1]='#';
    int j=2;
    for(int i=0; i<len; i++)
    {
        ss[j++]=s[i];
        ss[j++]='#';
    }
    ss[j]='\0';
    return j;
}
//时间复杂度为O(N)
int manacher(char *st, int len)
{
    int mx=0, ans=0, po=0;
    for(int i=1; i<=len; i++)
    {
        if(mx>i)
            p[i]=min(mx-i, p[2*po-i]);
        else
            p[i]=1;
        while( st[i-p[i] ] == st[ i+p[i] ] ) p[i]++;
        if(p[i]+i > mx)
        {
            mx=p[i]+i;
            po=i;
        }
        ans=max(ans, p[i]);
    }
    return ans-1;
}

原文地址:https://www.cnblogs.com/alking1001/p/12248549.html

时间: 2024-08-13 18:57:23

Manacher 入门+模板 回文串专用算法的相关文章

Hdu 3294 Girls&#39; research (manacher 最长回文串)

题目链接: Hdu 3294  Girls' research 题目描述: 给出一串字符串代表暗码,暗码字符是通过明码循环移位得到的,比如给定b,就有b == a,c == b,d == c,.......,a == z. 问最长回文串所在区间,以及最长回文串所表示的明码. 解题思路: 字符串长度[1,200000],用manacher算法很轻松就搞定了. get√新技能请点击me 1 #include <cstdio> 2 #include <cstring> 3 #includ

1112个人赛,最长回文串常见算法讨论

ps.此贴大部分文字与代码来自网上,我只是取长补短整理了下 S=“c a b a”  那么  S' = “a b a c”, 这样的情况下 S和 S‘的最长公共子串是aba.没有错误. 但是当 S=“abacdfgdcaba”, 那么S’ = “abacdgfdcaba”. 这样S和S‘的最长公共子串是abacd.很明显abacd并不是S的最长回文子串,它甚至连回文都不是. 现在是不是都明白为什么最长回文子串不能转化成为最长公共子串问题了.当原串S中含有一个非回文的串的反序串的时候,最长公共子串

131. 分割回文串-回溯算法 (leetcode)

给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回 s 所有可能的分割方案. 代码: class Solution: def __init__(self): self.res = [] def partition(self, s: str) -> List[List[str]]: self.helper(s,[]) return self.res def helper(self,part_of_s,answerList): if not part_of_s: self.re

Manacher 最长回文串问题

有人问你,一个字符串中最长的回文字串是谁? 作为一个 2B 青年, 一年前的我会这样回答:暴力枚举每个字串,判断合法与否? ╮(╯▽╰)╭ 就是没什么戏.... 后来,在机房的一个大牛的介绍下,我知道了 Manacher 算法. ............................ 其实 Manacher 和 KMP 是非常之像的. 令 rad[i] 表示以 第 i 个字符为中心的回文字串的半径长度. 那么我们考虑一下当前最远拓展到 j 编号为 rad[k],那么我们当前要计算的 rad[i

hdu----(4513)吉哥系列故事——完美队形II(manacher(最长回文串算法))

吉哥系列故事——完美队形II Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 1012    Accepted Submission(s): 358 Problem Description 吉哥又想出了一个新的完美队形游戏! 假设有n个人按顺序站在他的面前,他们的身高分别是h[1], h[2] ... h[n],吉哥希望从中挑出一些人,让

回文串问题

1.回文串的判断 #include <iostream> #include <string.h> using namespace std; //回文串的判断 bool isPalindrome(const char* src) { if(src == NULL) return true; int end = strlen(src)-1,begin = 0; while(begin < end)//从两边向中间判断,当然也可以从中间向两边判断 { if(src[begin] !

最长回文---hdu3068 (回文串 manacher 算法模板)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068 题意很清楚:就是求一个串s的子串中最长回文串的长度:这类题用到了manacher算法 manacher算法(复制大神的解释): 定义数组p[i]表示以i为中心的(包含i这个字符)回文串半径长 将字符串s从前扫到后for(int i=0;i<strlen(s);++i)来计算p[i],则最大的p[i]就是最长回文串长度,则问题是如何去求p[i]? 由于s是从前扫到后的,所以需要计算p[i]时一定

hdu 3068 最长回文串 o(n) Manacher 算法

最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 10596    Accepted Submission(s): 3759 Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等 Input 输入有多

HDU ACM 4513 吉哥系列故事——完美队形II-&gt;求最长回文串(manacher算法)

分析:该題可以通过求最长回文串的方法来解决:求最长回文串使用manacher算法,O(n)时间复杂度. 注意:while(a[i-len[i]]==a[i+len[i]] && a[i-len[i]]<=a[i-len[i]+2])这里多出的判断a[i-len[i]]<=a[i-len[i]+2]即为该題的限制从左到中保证身高不降,因在回文串的计算过程中添加了额外的字符,所以这里是i-len[i]+2而不是i-len[i]+1,以避开添加的字符. #include<ios