码迷,mamicode.com
首页 > 编程语言 > 详细

51 Nod 1089 最长回文子串(Manacher算法)

时间:2017-10-12 01:06:53      阅读:242      评论:0      收藏:0      [点我收藏+]

标签:com   一个   输入   manacher   pac   max   online   ring   for   

题目链接:传送门

题意:输入一个字符串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算法)

标签:com   一个   输入   manacher   pac   max   online   ring   for   

原文地址:http://www.cnblogs.com/Leonard-/p/7653411.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!