模板

【模板】manacher算法

不妨先只考虑如何求长度为奇数的回文串

记\(P[i]\)表示以\(i\)为中心最多向两边扩展几个字符,满足回文

如串\(ababa\),

\(P[1]=0,P[2]=1,P[3]=3,P[4]=1,P[5]=0\)

如果暴力求解的话就是枚举每个中心位置,暴力判断能否扩展,在随机条件下跑不满,但是如\(aaaaaaa\)这样的串能卡到\(O(n^2)\)

\(manacher\)算法

尝试利用以前求得的信息

还是一位一位的枚举,枚举到位置\(i\),记\(maxr\)为以\(i\)前面的字符为中心的回文串中最大的右端点位置,\(k\)为它的中心位置

如果\(i<maxr\),\(i\)在这个回文串上 ,就可以知道i的字符与\(k-(i-k)\)相同,P[k-(i-k)]至少为min(maxr-i,P[k-(i-k)]

然后在暴力扩展就好了

复杂度:\(maxr\)最多移动\(n\)次,复杂度\(O(n)\)

偶回文串:

把原字符串的每一位中间加一个特殊字符'#',以'#'为中心的奇回文串就对应原串中的偶回文串

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std; const int MAXN=22222222; int n,p[MAXN];
char a[MAXN],s[MAXN]; int main()
{
scanf("%s",a+1);
n=strlen(a+1);
s[0]='$';
for(int i=1;i<=n;++i)
s[i*2-1]='$',s[i*2]=a[i];
s[n*2+1]='$';
n=n*2+1;
int mx=0,k=0,Ans=0;
for(int i=1;i<=n;++i){
if(i<=mx)
p[i]=min(mx-i,p[k*2-i]);
while(s[i+p[i]+1]==s[i-p[i]-1]) ++p[i];
if(i+p[i]>mx) k=i,mx=i+p[i];
Ans=max(Ans,p[i]);
}
printf("%d\n",Ans);
return 0;
}

【P1659】[国家集训队]拉拉队排练

先求\(P\)数组,每个\(P[i]\)代表着长度为1~2*P[i]+1的回文串,区间加一可用差分维护,最后算一下前\(k\)大就行了

#include<iostream>
#include<cstring>
#include<cstdio>
#define int long long
using namespace std; const int MAXN=1000010;
const int MOD=19930726; inline int qpow(int x,int k){
int s=1;
while(k){
if(k&1) s=s*x%MOD;
k>>=1;
x=x*x%MOD;
}
return s;
} int n,k;
char s[MAXN];
int p[MAXN],diff[MAXN],a[MAXN]; signed main()
{
scanf("%lld%lld%s",&n,&k,s+1);
int mr=0,md=0;
s[0]='$';
for(int i=1;i<=n;++i){
if(i<=mr) p[i]=min(mr-i,p[md*2-i]);
while(s[i+p[i]+1]==s[i-p[i]-1]) ++p[i];
if(i+p[i]>mr) mr=i+p[i],md=i;
}
for(int i=1;i<=n;++i)
++diff[0],--diff[p[i]+1];
a[0]=diff[0];
for(int i=1;i<=n/2;++i)
a[i]=a[i-1]+diff[i];
int sum=0,Ans=1;
for(int i=n/2;i>=0;--i){
sum+=a[i];
if(sum>=k){
Ans=Ans*qpow(i*2+1,k-(sum-a[i]))%MOD;
break;
}
Ans=Ans*qpow(i*2+1,a[i])%MOD;
}
if(sum<k)
puts("-1");
else printf("%lld\n",Ans);
return 0;
}

manacher算法笔记的更多相关文章

  1. Manacher算法学习笔记 | LeetCode#5

    Manacher算法学习笔记 DECLARATION 引用来源:https://www.cnblogs.com/grandyang/p/4475985.html CONTENT 用途:寻找一个字符串的 ...

  2. 学习笔记 - Manacher算法

    Manacher算法 - 学习笔记 是从最近Codeforces的一场比赛了解到这个算法的~ 非常新奇,毕竟是第一次听说 \(O(n)\) 的回文串算法 我在 vjudge 上开了一个[练习],有兴趣 ...

  3. 「Manacher算法」学习笔记

    觉得这篇文章写得特别劲,插图非常便于理解. 目的:求字符串中的最长回文子串. 算法思想 考虑维护一个数组$r[i]$代表回文半径.回文半径的定义为:对于一个以$i$为回文中心的奇数回文子串,设其为闭区 ...

  4. Manacher算法学习笔记

    前言 Manacher(也叫马拉车)是一种用于在线性时间内找出字符串中最长回文子串的算法 算法 一般的查找回文串的算法是枚举中心,然后往两侧拓展,看最多拓展出多远.最坏情况下$O(n^2)$ 然而Ma ...

  5. 【学习笔记】Manacher算法

    本文部分图片来源 代码来源(代码是学姐哒.. 一.引入 Manacher算法是用来求最长回文子串的算法,时间复杂度O(n). 回文子串指的是''aacaa'',''noon'',这种正着反着读都一样的 ...

  6. Manacher 算法学习笔记

    算法用处: 解决最长回文子串的问题(朴素型). 算法复杂度 我们不妨先看看其他暴力解法的复杂度: \(O(n^3)\) 枚举子串的左右边界,然后再暴力判断是否回文,对答案取 \(max\) . \(O ...

  7. Leetcode 5. Longest Palindromic Substring(最长回文子串, Manacher算法)

    Leetcode 5. Longest Palindromic Substring(最长回文子串, Manacher算法) Given a string s, find the longest pal ...

  8. 使用manacher算法解决最长回文子串问题

    要解决的问题 求一个字符串最长回文子串是什么.且时间复杂度 O(N) 具体描述可参考: LeetCode_5_最长回文子串 LintCode_200_最长回文子串 暴力解法 以每个字符为中心向左右两边 ...

  9. HDU3068 回文串 Manacher算法

    好久没有刷题了,虽然参加过ACM,但是始终没有融会贯通,没有学个彻底.我干啥都是半吊子,一瓶子不满半瓶子晃荡. 就连简单的Manacher算法我也没有刷过,常常为岁月蹉跎而感到后悔. 问题描述 给定一 ...

随机推荐

  1. 使用JavaScript几种简单的排序

    前几天在工作碰到一个json对象排序的问题,一直认为JavaScript不能进行对象的排序,其实并不是,今天就来总结下常见的几种简单排序: 第一类 纯数字: var arrOld = [4,10,9, ...

  2. SpringBoot 基于web应用开发(请求参数获取,静态资源,webjars)

    SpringBoot 基于web应用开发 一.Lombok使用 1.导入依赖库 <dependency>    <groupId>org.projectlombok</g ...

  3. [转帖]ZEROCONF是什么

    ZEROCONF是什么 xjsunjie关注0人评论9867人阅读2014-05-13 16:12:18 https://blog.51cto.com/xjsunjie/1410592 奇怪 两个文档 ...

  4. SSL保护 C/S 、B/S 通信安全

    转:https://blog.csdn.net/GitChat/article/details/78431275 网络安全是一个永恒的话题,保护网络安全有很多方法,其中应用最为广泛的就是使用 SSL ...

  5. 《 .NET并发编程实战》阅读指南 - 第8章

    先发表生成URL以印在书里面.等书籍正式出版销售后会公开内容.

  6. SharpImage图像特效和合成类库介绍

    SharpImage是用于.NET(C#.VB)的专业图像特效以及图像合成类库.借助它,您可以快速实现Photoshop滤镜效果以及图层合成. 1.内置50+种图像特效滤镜.(如亮度.对比度.负片.图 ...

  7. 前端跨域之Jsonp实现原理及.Net下Jsonp的实现

    jsonp的本质是通过script标签的src属性请求到服务端,拿到到服务端返回的数据 ,因为src是可以跨域的.前端通过src发送跨域请求时在请求的url带上回调函数,服务端收到请求时,接受前端传过 ...

  8. flask中的static_path和static_path_url和static_folder

    static_folder表示静态文件所在路径,默认为root_dir下的static文件夹 static_url_path的行为比较复杂 如果static_folder未被指定(也就是默认值stat ...

  9. JAVA中的四种JSON解析方式详解

    JAVA中的四种JSON解析方式详解 我们在日常开发中少不了和JSON数据打交道,那么我们来看看JAVA中常用的JSON解析方式. 1.JSON官方 脱离框架使用 2.GSON 3.FastJSON ...

  10. tomcat采坑

    1. tomcat采坑 1.1. 采坑 今天又踩了个以前踩过的坑,运维系统迁移到docker,使用的tomcat版本是tomcat8,而原来的版本是tomcat7.0.53,导致的结果就是系统间请求一 ...