最长回文 --马拉车算法

总时间限制: 
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\n",ans);
51     }
52     return 0;
53 }
代码

 

posted @ 2017-04-29 18:27  拿叉插猹哈  阅读(179)  评论(0编辑  收藏  举报