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 ...
随机推荐
- c++中深层复制(浅层复制运行错误)成功运行-----sample
下面随笔给出c++中深层复制(浅层复制运行错误)成功运行------sample. 浅层复制与深层复制 浅层复制 实现对象间数据元素的一一对应复制. 深层复制 当被复制的对象数据成员是指针类型时,不是 ...
- 【转载】几张图轻松理解String.intern()
出处:https://blog.csdn.net/soonfly/article/details/70147205 在翻<深入理解Java虚拟机>的书时,又看到了2-7的 String.i ...
- js浅拷贝(地址引用)和深拷贝(克隆)
浅拷贝和深拷贝相对于引用类型而言的. js有两大类型值类型(基本数据类型)和引用类型(object,function,array): 值类型保存在栈上,引用类型保存在堆上. 浅拷贝只是单纯的拷贝对象的 ...
- Java入门和环境配置ideaJ安装
Java入门及环境搭建 目录 Java入门及环境搭建 什么是Java Java Java的发展 Java的特性和优势 Java三大版本 JDK JRE JVM JAVA开发环境搭建 安装JDK 卸载J ...
- 关于PHP的表单提交显示
实现功能:html页面,向表单内填入账号.密码:php页面,将填写的账号与密码信息展示出来. demo6.html代码如下: 1 <!DOCTYPE html> 2 <html& ...
- window 10 下 --excel | power query 通过 ODBC链接 mysql 数据库
excel链接到mysql的方法有几种,今天主要介绍如何通过ODBC链接 odbc是 "开放数据库连接",你可以通过下载插件使得自己的excel可以连接到不同的数据库. 关于版本的 ...
- 翻译:《实用的Python编程》04_04_Defining_exceptions
目录 | 上一节 (4.3 特殊方法) | 下一节 (5 对象模型) 4.4 定义异常 用户可以通过类实现自定义异常: class NetworkError(Exception): pass **异常 ...
- ListView解析
ListView通过一个Adapter来完成数据和组件的绑定.以ListActivity为例,它集成自Activity,里面包含有一个ListAdapter和一个ListView.绑定的操作通过set ...
- visual studio 2019 + cmake 实现windows linux跨平台开发环境搭建
visual studio 2019开始支持cmake跨平台开发. 以前cmake项目需要先生成vs项目,然后vs直接使用vs项目开发.现在可以直接用vs2019创建或打开cmake项目. 使用vis ...
- POJ_1273 Drainage Ditches 【网络流】
一.题面 Drainage Ditches 二.分析 网络流的裸题. 1 Edmonds-Karp算法 求解网络流其实就是一个不断找增广路,然后每次找到一条增广路后更新残余网络的一个过程. EK算法主 ...