洛谷P3805 [模板]Manacher算法 [manacher]
阿新 • • 發佈:2018-04-30
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 20182 //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]