题目描述

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

字符串长度为n

输入输出格式

输入格式:

一行小写英文字符a,b,c...y,z组成的字符串S

输出格式:

一个整数表示答案

题解及总结

  和很多字符串算法一样,Manacher算法与其说是一种算法,还不如说是一种优化暴力,利用了回文字符串的性质从而减少了许多不必要的枚举从而达到了O(n)级别,学习之后我已经深深折服在提出者的脑洞之下。

  首先,值得优化的是回文串的长度,因为回文串本身是分奇偶的,对此我们可以在一个回文串的首尾和每个字母间都插入一个无关字符(如:井字符‘#’)这样,所有的回文串都会变成长度为奇数的回文串了。

  对于一个回文串有这样的性质:

  我们定义一个回文串关于他的回文中心对称,他的回文半径为回文串回文中心到左右端点其中一端的距离。

  如图所示对于一个回文串a(黄色左边)和b(蓝色)因为b是关于mid(b)回文(对称)那么一定存在[l(b), r(a)]与[l(a'), r(b)]也是关于mid(b)对称的,又因为a是关于mid(a)回文的回文串,那么[l(b), p]一定也关于mid(a)回文的回文串,又由上述的关于mid(b)对称可知:[p', r(b)]一定关于mid(a‘)回文。

  由此性质我们可以得到一个获得对于每个回文中心的最长回文子串的方法:

  我们记录下回文串右端点最远可以到达的点为rmax,他的回文中心为mid。

  对于任意一个点p > mid一定存在一个p' = (mid << 1)- p与之对称,那么,以p为回文中心的回文半径至少为r(p) = min( r(p'), rmax - p)。除此之外,r(p)还有可能继续向外延伸,这就可以通过枚举来确定了。

  所以,我们求整个字符串每个最长回文串的长度只需要将整个字符串扫一遍就可以完成,时间复杂度为O()。

  而且更具这个性质,我们可以得到对于一个字符串,本质不同的不可继续扩展的回文串至多有n个。

代码

#include <bits/stdc++.h>
using namespace std; const int MAX = ;
char s[MAX << ], ch[MAX];
int p[MAX << ];
int len, cnt; void change()
{
cnt = ;
s[] = s[] = '#';
for(int i = ; i < len; ++ i) s[++ cnt] = ch[i], s[++ cnt] = '#';
} void manacher()
{
int mid = , rmax = ;
for(int i = ; i <= cnt; ++ i)
{
if(i < rmax)
{
int j = (mid << ) - i;
p[i] = min(p[j], rmax - i);
}
else p[i] = ;
for(;s[i + p[i]] == s[i - p[i]]; ++ p[i]);
if(p[i] + i > rmax)
{
rmax = p[i] + i ;
mid = i;
}
}
} int main()
{
//freopen("2.in", "r", stdin);
//freopen("2.out", "w", stdout); scanf("%s", ch);
len = strlen(ch);
change();
manacher();
int ans = ;
for(int i = ; i <= cnt; i ++) ans= max(ans, p[i]);
printf("%d\n", ans - );
return ;
}

最新文章

  1. Python列表list的用法
  2. bzoj 1066 蜥蜴
  3. PHP 编译安装
  4. 微信小程序 wx.getUserInfo 解密 C# 代码
  5. Visual Studio2008环境下查找C#中方法的“查看所有引用”
  6. D3(Data-Driven-Document)中的一些细节
  7. Delphi xe5 手机开发经验(新手级别)
  8. IOS关于录音,播放实现总结
  9. google protobuf ios开发使用
  10. angular-ngSanitize模块-linky过滤器详解
  11. Foundation of 3D computer Graphics--Reading notes
  12. v$osstat
  13. [转]bit与byte
  14. 分布式服务框架:Zookeeper
  15. rem是如何实现自适应中的?
  16. JavaScript中Ajax的get和post请求
  17. Yii2的相关学习记录,自定义gii模板和引用vendor中的js、css(四)
  18. poj 2828 Buy Tickets(树状数组 | 线段树)
  19. 分布式缓存-Memcached
  20. Bzoj3473

热门文章

  1. Java 写入pdf文件
  2. Java调度线程池ScheduleExecutorService
  3. (转)2017年最新企业面试题之shell(一,二)
  4. adb调试安卓
  5. unity 移动物体到指定位置的四种方法 【精确移动到指定位置,再也不是计算距离了,物体可以高速移动】
  6. springMVC静态资源访问
  7. nyoj 349&amp;Poj 1094 Sorting It All Out——————【拓扑应用】
  8. C++程序设计基础(4)宏定义和内联
  9. 适用于所有页面的基础样式base.css
  10. CMS API Overview - 翻译