题目描述

给出一个只由小写英文字符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. echarts Y轴数据类型不同怎么让折线图显示差距不大

    如果希望在同一grid中展示不同数据类型的折线(1000或10%),那么展现出来的折线肯定显示差距很大,那么怎么让这两条折线显示效果差不多,在之前的项目中碰到了这个问题 每条折线对应的是不同的数据组, ...

  2. Java非递归实现迷宫问题

    这个题目是本人的一次课程设计,也是我第一次独立做完的一个小玩意,说实话,昨晚的那一刻很有成就感.整个人开心到在自习室蹦起来.因为之前一直是自学的Java,从没有自己做过任何一个项目,这一个课程设计就花 ...

  3. git修改密码

    1.Windows10下更换Git用户名或密码 https://jingyan.baidu.com/article/642c9d3435a6e9644a46f732.html

  4. POJ 2570 Fiber Network

    Description Several startup companies have decided to build a better Internet, called the "Fibe ...

  5. Ansible 介绍和使用

    简介 Ansible是一个简单的自动化运维管理工具,基于Python语言实现,由Paramiko和PyYAML两个关键模块构建,可用于自动化部署应用.配置.编排task(持续交付.无宕机更新等).主版 ...

  6. Windows x64位通过PEB获得Kernel32基地址

    在64位系统下 gs:[0x30] 指向TEB gs:[0x60] 指向PEB kd> dt _TEB nt!_TEB +0x000 NtTib : _NT_TIB +0x000 Excepti ...

  7. [转]Create Custom Exception Filter in ASP.NET Core

    本文转自:http://www.binaryintellect.net/articles/5df6e275-1148-45a1-a8b3-0ba2c7c9cea1.aspx In my previou ...

  8. Nginx下载安装

    系统环境:win7 nginx:1.11.4 1.下载Nginx 下载地址:http://nginx.org/en/download.html 2.将压缩包解压到相应位置 3.启动nginx服务,ng ...

  9. mysql通过数据文件恢复数据方法

    情况描述:服务器硬盘损坏,服务器换了个新硬盘 ,然后老硬盘插在上面.挂载在这台机器.可以从老硬盘里面拿到数据.只拿到了里面的mysql数据文件夹,把数据文件夹覆盖新的服务器mysql数据文件夹 启动报 ...

  10. Hashtable语法简介

    Hashtable简述 Hashtable是System.Collections命名空间提供的一个容器 Hashtable中keyvalue键值对均为object类型,所以Hashtable可以支持任 ...