HDU3068 最长回文 马拉车 Manacher

朴灿烈づ我的快乐病毒、 2022-05-11 14:28 262阅读 0赞

Problem Description
给出一个只由小写英文字符a,b,c…y,z组成的字符串S,求S中最长回文串的长度.
回文就是正反读都是一样的字符串,如aba, abba等
Input
输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c…y,z组成的字符串S
两组case之间由空行隔开(该空行不用处理)
字符串长度len <= 110000
Output
每一行一个整数x,对应一组case,表示该组case的字符串中所包含的最长回文长度.
Sample Input
aaaa
abab
Sample Output
4
3

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #define Max 110005
  5. using namespace std;
  6. char Ma[Max*2];
  7. int Mp[Max*2];
  8. void Manacher(char s[],int len)
  9. {
  10. int l=0,i,j;
  11. Ma[l++]='$';
  12. Ma[l++]='#';
  13. for(i=0;i<len;i++)
  14. {
  15. Ma[l++]=s[i];
  16. Ma[l++]='#';
  17. }
  18. Ma[l]=0;
  19. int mx=0,id=0;
  20. for(i=0;i<l;i++)
  21. {
  22. Mp[i]=mx>i?min(Mp[2*id-i],mx-i):1;
  23. while(Ma[i+Mp[i]]==Ma[i-Mp[i]])
  24. Mp[i]++;
  25. if (i+Mp[i]>mx)
  26. {
  27. mx=i+Mp[i];
  28. id=i;
  29. }
  30. }
  31. }
  32. int main()
  33. {
  34. char s[Max];
  35. int len,ans,i;
  36. while(scanf("%s",s)!=EOF)
  37. {
  38. len=strlen(s),ans=0;
  39. Manacher(s,len);
  40. for(i=0;i<2*len+2;i++)
  41. ans=max(ans,Mp[i]-1);
  42. printf("%d\n",ans);
  43. }
  44. return 0;
  45. }

发表评论

表情:
评论列表 (有 0 条评论,262人围观)

还没有评论,来说两句吧...

相关阅读