题目描述

给出一个只由小写英文字符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. AIDL(2):服务端回调客户端

    1.大致流程 在服务端声明远程服务接口IRemoteService.aidl,并声明回调接口ICallback.aidl 在服务端实现远程服务接口IRemoteService.Stub 使用Remot ...

  2. nginx 模块介绍

    nginx模块在编译文件下的odjs目录下 cat 查看ngx_modules.c文件 可以看到一些基本extern模块 常用标准模块 1. 性能相关配置 worker_processes numbe ...

  3. harbor 仓库搭建

    一,介绍 Harbor是一个用于存储Docker镜像的企业级Registry服务. Registry是Dcoker官方的一个私有仓库镜像,可以将本地的镜像打标签进行标记然后push到以Registry ...

  4. IE中使用TerraExplorerPro ActiveX控件问题总结

    近段时间,由于工作需要,涉及到Skyline Web的二次开发,遇到一些问题: 问题1:IE中无法使用Skyline 提供的ActiveX Component 的API 解决方法:这个问题一般是没有正 ...

  5. js 省份城市二级动态联动的例子

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  6. Druid手动创建连接的坑

    环境:druid 1.1.10 今天优化了一天的代码, 老代码手动创建连接,坑 Connection conn = DBUtil.getConnection("d_log_dot_" ...

  7. 深入理解JavaScript系列(7):S.O.L.I.D五大原则之开闭原则OCP

    前言 本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第2篇,开闭原则OCP(The Open/Closed Principle ). 开闭原则的描述是: Software ...

  8. BlackLowKey主题CSS

    /* Minification failed. Returning unminified contents. (151,61): run-time error CSS1062: Expected se ...

  9. Android界面编程--使用活动条(ActionBar)--添加Action View

    ActionBar除了显示Action Item 外,还能显示普通的ui组件 2种方式添加Action View 1.指定ActionView的实现类 2.指定ActionView对应的视图资源 实现 ...

  10. 转载:.NET Memory Leak: XmlSerializing your way to a Memory Leak

    原文地址:http://blogs.msdn.com/b/tess/archive/2006/02/15/532804.aspx I hate to give away the resolution ...