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 ...
随机推荐
- 查看浏览器 请求网页 中 header body cookie
command + alt + i 进入开发者工具 重新刷新页面进行请求URL 进入Network 选中某个url 右侧会展示详细信息
- 生产者与消费者以及ActiveMQ
生产者与消费者以及ActiveMQ 一. 多线程实现生产者与消费者 1.1 生产者与消费者头文件 #pragma once #include <iostream> #include < ...
- SpringCloud(三):SpringCloud快速开发入门
3-1. 搭建和配置一个服务提供者 我们知道,SpringCloud 构建微服务是基于 SpringBoot 开发的.(如果SpringBoot不会的可以先看SpringBoot专栏) 1. 创建一 ...
- mysql 单表下的字段操作_查询
查询的规律 查询语句限定条件越多,查询范围越小: 1.整个表 Select * From 库名.表名 2.整个表的某字段内 Select id From 库名.表名 3.整个表某字段的范围内 Sele ...
- jquery动态赋值id与动态取id方法
$("#" + packageNameId + "").text(packageName); $("#" + packageNumId + ...
- C++对象的生存期笔记
下面随笔记录了C++对象的生存期知识 静态生存期 这种生存期与程序的运行期相同. 在文件作用域中声明的对象具有这种生存期. 在函数内部声明静态生存期对象,要冠以关键字static . 动态生存期 块作 ...
- springmvc字符 中文乱码问题
springmvc字符 中文乱码问题 1.字符过滤器 输入中文测试,发现乱码 以前乱码问题通过过滤器解决 , 而SpringMVC给我们提供了一个过滤器 , 可以在web.xml中配置,修改了xml文 ...
- 182. 查找重复的电子邮箱 + group by + having
182. 查找重复的电子邮箱 LeetCode_MySql_182 题目描述 方法一:使用笛卡尔积 # Write your MySQL query statement below select di ...
- 漏洞复现-CVE-2017-4971-Spring Web Flow 远程代码执行
0x00 实验环境 攻击机:Win 10 靶机也可作为攻击机:Ubuntu18 (docker搭建的vulhub靶场)(兼顾反弹shell的攻击机) 0x01 影响版本 Spring ...
- P1028_数的计算(JAVA语言)
题目描述 我们要求找出具有下列性质数的个数(包含输入的自然数n): 先输入一个自然数n(0n≤1000),然后对此自然数按照如下方法进行处理: 不作任何处理; 在它的左边加上一个自然数,但该自然数不能 ...