最长回文 --马拉车算法

总时间限制: 
10000ms
 
单个测试点时间限制: 
1000ms
 
内存限制: 
5120000kB
描述

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

回文就是正反读都是一样的字符串,如aba, abba等

输入
一个文件一组数据
每组输入为一行小写英文字符a,b,c...y,z组成的字符串S
字符串长度len <= 110000
输出
一个整数x,表示该字符串中所包含的最长回文长度.
样例输入
aaaa
-------------//忽视 分割线 下同
abab
样例输出
4
-------------
3


 1 /*
 2     裸的manache考虑三种情况 
 3 */
 4 #include<cstdio>
 5 #include<cstring>
 6 #include<iostream>
 7 #define MAXN 110010
 8 
 9 using namespace std;
10 
11 char s[MAXN];
12 
13 int L,l,ans;
14 
15 int t[MAXN*3],len[MAXN*3];
16 
17 inline void init() {
18     t[l++]='$';
19     t[l++]='#';
20     for(int i=0;i<L;i++) {
21         t[l++]=s[i];
22         t[l++]='#';
23     }
24     t[l]=0;
25     return;
26 }
27 
28 inline void manache(){
29     int p=0,p0=0;
30     for(int i=1;i<=l;i++) {
31         if(p>i) len[i]=min(len[2*p0-i],p-i);
32         else len[i]=1;
33         while(t[i-len[i]]==t[i+len[i]]) len[i]++;
34         if(len[i]+i>p) {
35             p=len[i]+i;
36             p0=i;
37         }
38         ans=max(ans,len[i]-1);
39     }
40     return;
41 }
42 
43 int main () {
44     while(cin>>s) {
45         L=l=ans=0;
46         L=strlen(s);
47         if(!L) break;
48         init();
49         manache();
50         printf("%d
",ans);
51     }
52     return 0;
53 }
代码


作者:乌鸦坐飞机
出处:http://www.cnblogs.com/whistle13326/
新的风暴已经出现 怎么能够停止不前 穿越时空 竭尽全力 我会来到你身边 微笑面对危险 梦想成真不会遥远 鼓起勇气 坚定向前 奇迹一定会出现

 
原文地址:https://www.cnblogs.com/whistle13326/p/6785809.html