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 }

 

你可能感兴趣的:(HDU)