题目描述

给出一个只由小写英文字符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 ;
}

Manacher算法模板的更多相关文章

  1. hdu-3068-最长回文(manacher算法模板)

    题目链接 /* Name:hdu-3068-最长回文 Copyright: Author: Date: 2018/4/24 16:12:45 Description: manacher算法模板 */ ...

  2. 字符串匹配--manacher算法模板

    manacher算法主要是处理字符串中关于回文串的问题的,它可以在 O(n) 的时间处理出以字符串中每一个字符为中心的回文串半径,由于将原字符串处理成两倍长度的新串,在每两个字符之间加入一个特定的特殊 ...

  3. 最长回文子串Manacher算法模板

    Manacher算法能够在O(N)的时间复杂度内得到一个字符串以任意位置为中心的回文子串.其算法的基本原理就是利用已知回文串的左半部分来推导右半部分. 首先,在字符串s中,用rad[i]表示第i个字符 ...

  4. 最长回文---hdu3068 (回文串 manacher 算法模板)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068 题意很清楚:就是求一个串s的子串中最长回文串的长度:这类题用到了manacher算法 #incl ...

  5. hdu3294 Manacher算法模板

    题目链接:http://icpc.njust.edu.cn/Problem/Hdu/3294/ 回文长度如果是mxx,回文中心是id的话,在扩展串中(id-mxx+1,id+mxx-1)的这段中去除标 ...

  6. 洛谷P3805 [模板]Manacher算法 [manacher]

    题目传送门 题目描述 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 字符串长度为n 输入输出格式 输入格式: 一行小写英文字符a,b,c...y,z组成的字符 ...

  7. 题解 P3805 【【模板】manacher算法】

    题解 P3805 [[模板]manacher算法] 我们先看两个字符串: ABCCBA ABCDCBA 显然这两字符串是回文的 然而两个串的对称中心的特性不同,第一个串,它的对称中心在两个C中间,然而 ...

  8. 洛谷 P3805 【模板】manacher算法

    洛谷 P3805 [模板]manacher算法 洛谷传送门 题目描述 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 字符串长度为n 输入格式 一行小写英文字符 ...

  9. Manacher || Luogu P3805【模板】manacher算法

    题面:[模板]manacher算法 代码: #include<cstdio> #include<cstring> #include<iostream> #defin ...

随机推荐

  1. 2019.03.26 读书笔记 关于for与foreach

    for 是索引器,foreach是迭代器 foreach在movenext()中增加了对集合版本(一个整数,每次对集合修改都+1)的验证,另外反编译后的效果是使用了using(是try finally ...

  2. drupal 7 安装失败后的补救办法

    在安装 drupal 7 时安装,导入数据库已经成功,但是在安装语言包的时候卡住了,没有进行最后三步,管理员帐号没能启用.此时我退出安装,访问网站,没有问题.但是管理员admin的密码没有设置,以至于 ...

  3. 使用SeaJS实现模块化JavaScript开发【转】

    前言 SeaJS是一个遵循CommonJS规范的JavaScript模块加载框架,可以实现JavaScript的模块化开发及加载机制.与jQuery等JavaScript框架不同,SeaJS不会扩展封 ...

  4. RabbitMQ学习整理

    1.什么是消息队列? 概念: 消息队列(Message Queue,简称MQ),本质是个队列,FIFO先入先出,只不过队列中存放的内容是一些Message. 2.为什么要用消息队列,应用场景? 不同系 ...

  5. SpringBoot | 第三十三章:Spring web Servcies集成和使用

    前言 最近有个单位内网系统需要对接统一门户,进行单点登录和待办事项对接功能.一般上政府系统都会要求做统一登录功能,这个没啥问题,反正业务系统都是做单点登录的,改下shiro相关类就好了.看了接入方案, ...

  6. go test遇到的一些问题-command-line-arguments undefined: xxxxx

    一 问题是在我写算法题的时候出的,test后缀的文件编译报command-line-arguments undefined: xxxxx 二 没记错,go test是 所有在以_test结尾的源码内以 ...

  7. 吴恩达《Machine Learning Yearning》总结(11-20章)

    11.何时修改开发集.测试集和度量指标 开展一个新项目,尽快选好开发集和测试集:例子,根据度量指标A分类器排在B分类器前面,但是团队认为B分类器在实际产品上优于A分类器,这时就需要考虑修改开发集和测试 ...

  8. small zhishi

    \\192.168.1.201\d$\Data 访问远程计算机文件资源管理器

  9. 实现JFileChooser的多种文件类型限制(设置过滤器)

    使用时直接调用方法. // 多类型时使用 public void FileFilter(JFileChooser F) { String[][] fileNames = { { ".java ...

  10. hibernate注解JPA

    1.JPA与hibernate 什么是JPA ? java persistence api :java持久化api,同一的ORM规范,是由sun公司指定的规范接口,hibernate实现了JPA规范. ...