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

最长回文子串Manacher算法模板

时间:2016-05-01 14:57:44      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:

Manacher算法能够在O(N)的时间复杂度内得到一个字符串以任意位置为中心的回文子串。其算法的基本原理就是利用已知回文串的左半部分来推导右半部分。

例题:HDU 3068

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<iostream>
 4 using namespace std;
 5 const int N=110005;
 6 char s[N],cpy[N<<1];
 7 int rad[N<<1];
 8 void manacher(char *s,int len,int rad[])
 9 {
10     for(int i=1,j=0,k;i<len;i+=k)
11     {
12         while(s[i-j-1]==s[i+j+1])    j++;//扫描出当前rad
13         rad[i]=j;
14         for(k=1;k<=rad[i]&&rad[i-k]!=rad[i]-k;k++)//通过前半部分推出后半部分
15             rad[i+k]=min(rad[i-k],rad[i]-k);
16         j=max(j-k,0);//更新
17     }
18 }
19 void work(char *s,int rad[])
20 {
21         //预处理
22     int len=strlen(s);
23     cpy[0]=(;cpy[1]=#;
24     for(int i=0,j=2;i<len;i++,j+=2)
25     {
26         cpy[j]=s[i];
27         cpy[j+1]=#;
28     }
29     cpy[(len=2*len+3)-1]=);
30     manacher(cpy,len,rad);
31     int ans=1;
32     for(int i=0;i<len;i++)
33         ans=max(ans,rad[i]);
34     printf("%d\n",ans);
35 }
36 int main()
37 {
38     while(scanf("%s",s)!=EOF)
39     {
40         work(s,rad);
41     }
42     return 0;
43 }

  参考文章:http://www.cnblogs.com/Lyush/p/3221503.html

最长回文子串Manacher算法模板

标签:

原文地址:http://www.cnblogs.com/L-King/p/5450472.html

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