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算法)

51 nod 1088 最长回文子串

51NOD-01089 最长回文子串 V2(Manacher算法)

1089 最长回文子串

1088 最长回文子串

51nod 1089 最长回文字串