51 Nod 1089 最长回文子串(Manacher算法)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51 Nod 1089 最长回文子串(Manacher算法)相关的知识,希望对你有一定的参考价值。
题目链接:传送门
题意:输入一个字符串Str,输出Str里最长回文子串的长度。(Str的长度<=100000)
题解:Manacher模板题,先抄个模板先(待补)
1 //Manacher(马拉车算法 )求最长回文子串 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 7 const int N=100000+10; 8 char s[N]; 9 char s_new[2*N]; 10 int p[2*N]; 11 12 int Init(){ 13 int len=strlen(s); 14 s_new[0]=‘$‘;s_new[1]=‘#‘; 15 int j=2; 16 for(int i=0;i<len;i++){ 17 s_new[j++]=s[i]; 18 s_new[j++]=‘#‘; 19 } 20 s_new[j]=‘\0‘; 21 return j; 22 } 23 24 int Manacher(){ 25 int len=Init(); 26 int max_len=-1; 27 int id,mx=0; 28 for(int i=1;i<len;i++){ 29 if(i<mx) p[i]=min(p[2*id-i],mx-i); 30 else p[i]=1; 31 while(s_new[i-p[i]]==s_new[i+p[i]]) p[i]++; 32 if(mx<i+p[i]) {id=i;mx=i+p[i];} 33 max_len=max(max_len,p[i]-1); 34 } 35 return max_len; 36 } 37 38 int main(){ 39 cin>>s; 40 cout<<Manacher()<<endl; 41 return 0; 42 }
以上是关于51 Nod 1089 最长回文子串(Manacher算法)的主要内容,如果未能解决你的问题,请参考以下文章
51nod 1089 最长回文子串 V2(Manacher算法)