题目链接:https://www.luogu.com.cn/problem/P3805

Manacher算法$O(n)$:

求以每个字符为中心的最长回文串的半径:
如果要求可以以字符间隙为回文中心,就要在每两个字符之间加入一个’#’,在开头加上'$',然后再解决。

$pos$表示回文字串的对称轴,$mx$表示回文串在最右右边界,很明显$2\times pos-i$即为$i$关于$pos$的对称点。

令$r_i$为以$i$为中心的最长回文半径。从左往右依次求$r$数组:
若$i>mx$,即$i$不在所已知的回文串的范围内,那么就让$r_i$从$1$开始计算。

若$i\leq mx$:

  设$j$为$i$关于$pos$的对称点,即$j=(2\times pos-i)$。

  1),若$r_j>mx-i$,那么不能保证在mx右边仍为回文,所以这时$r_i=mx-i$。

  2),若$r_j\leq mx-i$,那么根据对称性可以直接得到,$r_i=r_j$。

  综上所述,$r_i=min(r_j,mx-i)$。

然后开始暴力往两边扩展,看看是否满足回文。如果右端点扩展到mx右边,则需要更新$mx$和$pos$。

最后不难发现,$r_i-1$中的最大值即为答案,即$ans=max(ans,r_i-1)$。

AC代码:

 #include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=;
char str[maxn],s[maxn];
int r[maxn]; int manacher(int len){
int t=,ans=;
s[]='$';s[++t]='#';
for(int i=;i<=len;i++){
s[++t]=str[i];
s[++t]='#';
}
int pos=,mx=;
for(int i=;i<=t;i++){
if(i>mx) r[i]=;
else r[i]=min(r[*pos-i],mx-i);
while(i-r[i]>=&&i+r[i]<=t&&s[i+r[i]]==s[i-r[i]]) r[i]++;
if(i+r[i]>mx){
mx=i+r[i];
pos=i;
}
ans=max(ans,r[i]-);
}
return ans;
} int main(){
scanf("%s",str+);
printf("%d\n",manacher(strlen(str+)));
return ;
}

AC代码

洛谷 P3805【模板】manacher算法的更多相关文章

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

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

  2. 洛谷.3805.[模板]manacher算法

    题目链接 之前做很早了没写这篇,补上. 记录当前ex[]最大的回文中心id和最远延伸范围mx! 关于串的构造: 应该是 @ #A#B#C#B#A# $ ,而不是 @ A#B#C#B#A $ 比如 @a ...

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

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

  4. 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)

    To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...

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

    题目链接 manacher算法:在线性时间内求一个字符串中所有/最长回文串的算法. 先来考虑一下暴力的算法,枚举每个中点,向两边扩展,时间复杂度\(O(n^2)\). 来分析下此算法的缺点. 1.因为 ...

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

    题目大意:给你一个字符串,求出它的最长回文字段 题解:$manacher$算法 卡点:$p$数组未开两倍空间 C++ Code: #include <cstdio> #include &l ...

  7. 洛谷P3375 [模板]KMP字符串匹配

    To 洛谷.3375 KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果 ...

  8. LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)

    为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...

  9. 【AC自动机】洛谷三道模板题

    [题目链接] https://www.luogu.org/problem/P3808 [题意] 给定n个模式串和1个文本串,求有多少个模式串在文本串里出现过. [题解] 不再介绍基础知识了,就是裸的模 ...

随机推荐

  1. 遇到的错误:Mysql 报错Duplicate entry '值' for key '字段名'的解决

    ### Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolatio ...

  2. ubuntu16.04更换成国内源

    一.首先使用自带的vi编辑器 安装完ubuntu后没有默认的root密码,如果要设置root密码需要进行如下步骤: 1 sudo passwd 2 连续输入两次新密码 二.vi编辑器下使用[backs ...

  3. 使用vue/cli 创建一个简单的项目

    首先,电脑安装了node.js官方要求8.9 或更高版本 (推荐 8.11.0+) npm install -g @vue/cli # OR yarn global add @vue/cli 全局安装 ...

  4. python复习基础题目

    第一部分 必答题(每题2分) 简述列举了解的编程语言及语言间的区别? 编译型语言:一次性全部编译成二进制码,再去执行 解释性语言:编译一句,运行一句 python 解释型,简洁高效,容易上手 Java ...

  5. 论文阅读笔记(六)【TCSVT2018】:Semi-Supervised Cross-View Projection-Based Dictionary Learning for Video-Based Person Re-Identification

    Introduction (1)Motivation: ① 现实场景中,给所有视频进行标记是一项繁琐和高成本的工作,而且随着监控相机的记录,视频信息会快速增多,因此需要采用半监督学习的方式,只对一部分 ...

  6. laravel封装返回json信息工具类

    1.工具类可以一次写入多方多方调用,很大程度的节约开发时间得到想要的信息 这里演示一个json接口的工具类(文件定义在App\Http\Controllers\Tools)中 <?php /** ...

  7. vue制作滚动条幅-跑马灯效果实例代码

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

  8. POJ 2096 Collecting Bugs (概率DP,求期望)

    Ivan is fond of collecting. Unlike other people who collect post stamps, coins or other material stu ...

  9. 使用pycharm搜索框和正则表达式匹配内容

    使用pycharm搜索框和正则表达式匹配内容原创薯饼__ 最后发布于2019-03-04 19:28:53 阅读数 660 收藏展开有时候我们要在爬虫网站中匹配各种各样的文本块,以获取需要的信息,每一 ...

  10. Progressbar 实例

    Progressbar 实例原创侠之大者为国为民 最后发布于2015-10-28 15:22:34 阅读数 5394 收藏展开Progressbar - orient 配置进度条的方向:"h ...