模板 manacher算法

题目描述

给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.

字符串长度为n

输入输出格式

输入格式:

一行小写英文字符a,b,c...y,z组成的字符串S

输出格式:

一个整数表示答案

输入输出样例

输入样例#1: 复制
aaa
输出样例#1: 复制
3

说明

字符串长度len <= 11000000

http://blog.csdn.net/dyx404514/article/details/42061017

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 using namespace std;
 7 char ch[11000005],s[30000005];
 8 int len[30000005],n,ans,tot;
 9 void change()
10 {int i,j;
11   for (i=0;i<n;i++)
12     {
13       s[++tot]='#';
14       s[++tot]=ch[i];
15     }
16   s[++tot]='#';
17   s[++tot]='$';
18   n=tot;
19 }
20 void manacher()
21 {int i;
22   int mx=0,po=0;
23   for (i=1;i<=n;i++)
24     {
25       if (mx>i)
26     len[i]=min(mx-i,len[2*po-i]);
27       else len[i]=1;
28       while (s[i-len[i]]==s[i+len[i]]) len[i]++;
29       if (len[i]+i>mx)
30     {
31       po=i;
32       mx=len[i]+i;
33     }
34       ans=max(ans,len[i]-1);
35     }
36 }
37 int main()
38 {
39   scanf("%s",ch);
40   n=strlen(ch);
41   change();
42   manacher();
43   cout<<ans;
44 }

 

posted @ 2018-01-30 09:38  Z-Y-Y-S  阅读(136)  评论(0编辑  收藏  举报