Manachar's Algorithm
1、模板
1 #include<bits/stdc++.h>
2 using namespace std;
3 const int MAX=21000020;
4 char s[MAX],t[MAX<<1];
5 int p[MAX<<1],cnt=0,mid,mr;
6 void manachar()
7 {
8 t[cnt++]='$';
9 int len=strlen(s);
10 for(int i=0;i<len;i++)
11 {
12 t[cnt++]='#';
13 t[cnt++]=s[i];
14 }
15 t[cnt++]='#';
16 t[cnt]='\0';
17
18 for(int i=0;i<cnt;i++)
19 {
20 p[i]=i<mr?min(p[(mid<<1)-i],mr-i):1;
21 for(;t[p[i]+i]==t[i-p[i]] and p[i]+i<cnt;p[i]++)
22 if(p[i]+i>mr)
23 {
24 mid=i;
25 mr=p[i]+i;
26 }
27 }
28 }
29 int main()
30 {
31 scanf("%s",s);
32 manachar();
33 int ans=1;
34 for(int i=0;i<cnt;i++)
35 ans=max(ans,p[i]);
36 printf("%d",ans-1);
37 return 0;
38 }
2、一些结论
1、在往后推maxr时,此时的p[i]就是以maxr为结尾的最长回文串(例题:最长双回文串(有坑))
1 #include<bits/stdc++.h>
2 using namespace std;
3 const int MAX=1e5+10;
4 char pic[MAX],s1[MAX<<1],s2[MAX<<1];
5 int p1[MAX<<1],p2[MAX<<1],cnt=2;
6 int ans1[MAX<<1] ,ans2[MAX<<1],len;
7 void manachar(char * s,int * p,int * ans)
8 {
9 int mid=0,mr=0;
10 for(int i=0;i<cnt;i++)
11 {
12 p[i]=i<mr?min(p[mid*2-i],mr-i):1;
13 for(;s[p[i]+i]==s[i-p[i]];p[i]++)
14 if(i+p[i]>mr)
15 {
16 mr=i+p[i];
17 ans[mr]=p[i];
18 mid=i;
19 }
20 }
21 }
22 int main()
23 {
24 scanf("%s",pic);
25 len=strlen(pic);
26 s1[0]=s2[0]='$';
27 s1[1]=s2[1]='#';
28 for(int i=0;i<len;i++)
29 {
30 s1[cnt]=pic[i];
31 s2[cnt]=pic[len-i-1];
32 s1[++cnt]='#';
33 s2[cnt++]='#';
34 }
35 cnt++;
36 s1[cnt]=s2[cnt]='\0';
37 manachar(s1,p1,ans1);
38 manachar(s2,p2,ans2);
39 int j=cnt-4,ans=2;
40 for(int i=3;i<cnt-2;i++)
41 {
42 if(s1[i]=='#')
43 ans=max(ans,ans1[i]+ans2[j]);
44 j--;
45 }
46 cout<<ans<<endl;
47 return 0;
48 }
2、
Manachar's Algorithm的更多相关文章
- Manachar’s Algorithm
Manachar's Algorithm Longest palindromic substring - Wikipedia https://en.wikipedia.org/wiki/Longes ...
- bzoj 3676 回文串 manachar+hash
考虑每个回文串,它一定是它中心字母的最长回文串两侧去掉同样数量的字符后的一个子串. 所以我们可以用manachar求出每一位的回文半径,放到哈希表里并标记出它的下一个子串. 最后拓扑排序递推就行了.. ...
- BZOJ 2342 & manachar+最优性剪枝
题意: 求最长回文串,串的两边都是回文串. Solution: manachar预处理然后暴力找... Code: #include <iostream> #include <cst ...
- bzoj 3160: 万径人踪灭 manachar + FFT
3160: 万径人踪灭 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 133 Solved: 80[Submit][Status][Discuss] ...
- hdu 3068 最长回文(manachar模板)
Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.回文就是正反读都是一样的字符串,如aba, abba等 Input 输 ...
- HDU 3294 Girls' research(manachar模板题)
Girls' researchTime Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total ...
- HDU 3068 最长回文(manachar算法)
最长回文 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- Manachar算法详解
求解最长回文串之Manachar算法 问题类型: 输入一个字符串,求出其中最大的回文子串.子串的含义是:在原串中连续出现的字符串片段. 回文的含义是:正着看和倒着看相同,如abba和yyxyy. 这类 ...
- hdu 4513 吉哥系列故事——完美队形II (manachar算法)
吉哥系列故事——完美队形II Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) P ...
随机推荐
- Java流程控制:选择结构
一.选择结构 选择结构用于判断给定的条件,根据判断的结果来控制程序的流程. Java中选择结构的语法主要分为'if...else'语句和'switch...case'语句. Java中选择结构语句在语 ...
- 翻译:《实用的 Python 编程》02_07_Objects
目录 | 上一节 (2.6 列表推导式) | 下一节 (3 从程序组织) 2.7 对象 本节介绍有关 Python 内部对象模型的更多详细信息,并讨论一些与内存管理,拷贝和类型检查有关的问题. 赋值 ...
- 下载HLS视频到本地
现在绝大多数网站播放视频都采用HLS技术,像腾讯优酷爱奇艺等等.本篇博文将介绍如何下载这样的视频到本地. 前言 因疫情影响,上课部分课程采用腾讯课堂上课,腾讯课堂有直播回放功能,但这个功能腾讯显然没有 ...
- C++入门(2):为何还学C++?
本文首发 | 公众号:lunvey 提及编程语言,最近很火的当属Python和Java,似乎C++没落了,真的是这样吗? 转行做程序员,掌握一门编程语言,也就是职业技能,我相信更多的是在乎未来发展而不 ...
- Java多态练习题
需求: 宠物饿了,需要铲屎官给宠物喂食. 不同宠物吃的东西不一样. 不同宠物恢复后体力值不一样. 铲屎官和狗狗玩接飞盘游戏,狗狗健康值减少10,与铲屎官亲密度增加5 铲屎官和 企鹅玩游泳游戏,企鹅健康 ...
- LeetCode-二叉搜索树的第k大节点
二叉搜索树的第k大节点 LeetCode-面试题54 需要充分了解二叉搜索树的性质. 利用中序遍历的思想,采用相反的思想:先遍历右节点再遍历左节点. /** * 给定一棵二叉搜索树,请找出其中第k大的 ...
- vs2019远程调试
VS2019远程调试 这几天遇到个很是纠结的问题,同样的源代码,放在测试服务器,完美运行.但是上线正式环境就是死活显示不出来.于是想到了微软的远程调试功能,这里用VS2019举例. 下载远程访问工具 ...
- MyBatis中的Map
接口 int addUserMap(Map<String, Object> map); Mapper.xml <!-- Map比较灵活 传递的值为Map的key,可以为任何(野路子, ...
- JavaScript offset、client、scroll家族
offsetParent <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- WPF 应用 - WPF 播放 GIF 的两种方式
1. 使用 Winform 的 PictureBox 1.1 引用 dll WindowsFormsIntegration.dll System.Windows.Forms.dll System.Dr ...