hdu 3068 最长回文 manacher

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068

给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.
回文就是正反读都是一样的字符串,如aba, abba等
 
题目描述:中文题,不翻译。
算法分析:求解最长回文串的长度,当选O(n)的manacher算法。
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<algorithm>
 7 #include<vector>
 8 #define inf 0x7fffffff
 9 using namespace std;
10 typedef long long LL;
11 const int maxn=110000+100;
12 char str[maxn],s[3*maxn+1000];
13 int p[3*maxn+100],cnt;
14 void manacher()
15 {
16     int mx=0,id=0;
17     for (int i=1 ;i<cnt ;i++)
18     {
19         if (mx>i) p[i]=min(p[2*id-i],mx-i);
20         else p[i]=1;
21         for ( ;s[i+p[i] ]==s[i-p[i] ] ;p[i]++) ;
22         if (p[i]+i>mx)
23         {
24             mx=p[i]+i;
25             id=i;
26         }
27     }
28     //cout<<p[id]-1<<endl;
29     int ans=0;
30     for (int i=1 ;i<cnt ;i++) ans=max(ans,p[i]);
31     cout<<ans-1<<endl;
32 }
33 int main()
34 {
35     memset(str,0,sizeof(str));
36     while (scanf("%s",str)!=EOF)
37     {
38         cnt=0;
39         memset(s,0,sizeof(s));
40         memset(p,0,sizeof(p));
41         s[cnt++]='$';
42         int len=strlen(str);
43         for (int i=0 ;i<len ;i++)
44         {
45             s[cnt++]='#';
46             s[cnt++]=str[i];
47         }
48         s[cnt++]='#';
49         s[cnt]=0;
50         manacher();
51     }
52     return 0;
53 }

 

posted @ 2015-03-15 15:30  huangxf  阅读(130)  评论(0编辑  收藏  举报