1. 程式人生 > >洛谷P3805 [模板]Manacher算法 [manacher]

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

lse adg bit -i col log 輸入 ace pre

  題目傳送門

  

題目描述

給出一個只由小寫英文字符a,b,c...y,z組成的字符串S,求S中最長回文串的長度.

字符串長度為n

輸入輸出格式

輸入格式:

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

輸出格式:

一個整數表示答案

輸入輸出樣例

輸入樣例#1:
aaa
輸出樣例#1:
3

說明

字符串長度len <= 11000000


  分析:manacher算法模板,算法分析就不具體講了,five20大佬講的挺好的,可以參照一下他的博客。

  Code:

  

 1 //It is made by HolseLee on 30th Apr 2018
2 //Luogu.org P3805 3 #include<bits/stdc++.h> 4 using namespace std; 5 const int N=2e7+3e6+7; 6 char s[N],neo[N];int p[N]; 7 int change() 8 { 9 int len=strlen(s); 10 int ret=0;neo[ret++]=$; 11 for(int i=0;i<len;i++) 12 neo[ret++]=#,neo[ret++]=s[i]; 13 neo[ret++]=
#;neo[++ret]=\0;return ret; 14 } 15 int manacher() 16 { 17 int len=change(); 18 int ans=-N,id,mx=0; 19 for(int i=1;i<=len;i++){ 20 if(i<mx)p[i]=min(p[id*2-i],mx-i); 21 else p[i]=1; 22 while(neo[i-p[i]]==neo[i+p[i]])p[i]++; 23 ans=max(ans,p[i]-1); 24 if(i+p[i]>mx)id=i,mx=i+p[i];
25 } 26 return ans; 27 } 28 int main() 29 { 30 scanf("%s",s); 31 printf("%d",manacher()); 32 return 0; 33 }

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