洛谷P3805 [模板]Manacher算法 [manacher]

Posted H

tags:

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

  题目传送门

  

题目描述

给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.

字符串长度为n

输入输出格式

输入格式:

 

一行小写英文字符a,b,c...y,z组成的字符串S

 

输出格式:

 

一个整数表示答案

 

输入输出样例

输入样例#1:
aaa
输出样例#1:
3

说明

字符串长度len <= 11000000

 


 

 

  分析:manacher算法模板,算法分析就不具体讲了,five20大佬讲的挺好的,可以参照一下他的博客

  Code:

  

#include<bits/stdc++.h>
using namespace std;
const int N=2e7+3e6+7;
char s[N],neo[N];int p[N];
int change()
{
  int len=strlen(s);
  int ret=0;neo[ret++]=\'$\';
  for(int i=0;i<len;i++)
    neo[ret++]=\'#\',neo[ret++]=s[i];
  neo[ret++]=\'#\';neo[++ret]=\'\\0\';return ret;
}
int manacher()
{
  int len=change();
  int ans=-N,id,mx=0;
  for(int i=1;i<=len;i++){
    if(i<mx)p[i]=min(p[id*2-i],mx-i);
    else p[i]=1;
    while(neo[i-p[i]]==neo[i+p[i]])p[i]++;
    ans=max(ans,p[i]-1);
    if(i+p[i]>mx)id=i,mx=i+p[i];
  }
  return ans;
}
int main()
{
  scanf("%s",s);
  printf("%d",manacher());
  return 0;
}

 

以上是关于洛谷P3805 [模板]Manacher算法 [manacher]的主要内容,如果未能解决你的问题,请参考以下文章

P3805 模板manacher算法

Manacher || Luogu P3805模板manacher算法

P3805 模板manacher算法

P3805 模板manacher算法(马拉车)

P3805 模板manacher 算法马拉车

字符串-Manacher算法(你知道马拉车算法吗?)