Manacher模板( 线性求最长回文子串 )
模板
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
using namespace std;
;
];
], id, mx=;
int L, R; //回文串在原串的左右端点位置
int Init()
{
int len = strlen(s);
sNew[] = '$';
sNew[] = '#';
;
; i < len; i++){
sNew[j++] = s[i];
sNew[j++] = '#';
}
sNew[j] = '\0';
return j;
}
int Manacher()
{
int len = Init();
;
mx = ;
; i < len; i++){
* id - i], mx - i);
;
///在对象不是字符串时候,原本为了防止越界是左有'$'
///右有'\0',现在右边就没有'\0',需要人为填充替代!
while (sNew[i - p[i]] == sNew[i + p[i]]) p[i]++;
if (mx < i + p[i]){
id = i;
mx = i + p[i];
}
//max_len = max(max_len, p[i] - 1);
//// 如果题目不要求输出回文串在原串的位置,则用下面代码更新答案
if(max_len < p[i]){ ///这里L、R记录的是最长回文子串在原串的左右端点
max_len = p[i];
L = (i - p[i])>>;
R = (i + p[i] - )>>; ///R = (i + p[i])/2 -2;
}
}
return max_len;
/// 最后如若需要找到的回文串则是
/// for(int i=(id-mx+1);i<=(id+mx-1);i++)
/// if(sNew[i]!='#'&&sNew[i]!='$') ///注意你设置的开头符号和填充符号,不同则需要修改
/// putchar(sNew[i]);
}
p[i]-1 为以 i 为中心的回文长度
p[i]/2 表示回文半径
i%2==0 表示这个位置为字符,i/2-1 表示原字符串的位置
i%2==1 表示为字符中间,这两边的字符在原字符串的位置分别为 i/2-1 和 i/2
问题提出 : 给出一个串,要求在O(n)时间复杂度内计算出最长的回文子串
分析参考==> https://www.61mon.com/index.php/archives/181/ or https://www.felix021.com/blog/read.php?2040
相关题目 :
① HDU 3068
题意 : 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.
分析 : 模板题
② POJ 3974
题意 : 给出一个串,求最长回文子串
分析 : 还是模板题
题意 : 中文题就不复述了
分析 : 实际上还是模板题,只要在回文判断两边相等的代码上加上递增这一条件即可
#include <iostream>
#include <cstring>
#include <algorithm>
#include<stdio.h>
using namespace std;
;
const int INF = 0x3f3f3f3f;
];
], id, mx=;
int len;
int Init()
{
s_new[] = -;
s_new[] = INF;
;
; i < len; i++){
s_new[j++] = s[i];
s_new[j++] = INF;
}
return j; // 返回 s_new 的长度
}
int Manacher()
{
int len = Init(); // 取得新字符串长度并完成向 s_new 的转换
; // 最长回文长度
mx = ;
; i < len; i++){
* id - i], mx - i); // 需搞清楚上面那张图含义, mx 和 2*id-i 的含义
;
while (s_new[i - p[i]] == s_new[i + p[i]]
&& s_new[i - p[i]] <= s_new[i - p[i] + ]) p[i]++;// 不需边界判断,因为左有'$',右有'\0'
if (mx < i + p[i]){
id = i;
mx = i + p[i];
}
max_len = max(max_len, p[i] - );
}
return max_len;
/// 最后如若需要找到的回文串则是
/// for(int i=(id-mx+1);i<=(id+mx-1);i++)
/// if(s_new[i]!='#'&&s_new[i]!='$')
/// putchar(s_new[i]);
}
int main(void)
{
int nCase;
scanf("%d", &nCase);
while(nCase--){
scanf("%d", &len);
; i<len; i++) scanf("%d", &s[i]);
printf("%d\n", Manacher());
}
;
}
④ HDU 3294
题意 : 首先给出一个字符,代表所有的字符真正对应的都往前移动,例如给出'b'那么真正的'a'就是'b','b'就是真正的'c',后来再给你一个串,问你通过上面转变后的最长回文子串是什么,给出首尾位置以及具体的回文序列
分析 : 这里多了一步需要具体定位回文,那么根据算法的具体意义,可以知道最长回文串的起始位置L=(i-p[i])/2,R=(i+p[i])/2-2,每一次更新答案都去更新L、R即可
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
using namespace std;
;
];
], id, mx=;
int L, R; //回文串在原串的左右端点位置
int Init()
{
int len = strlen(s);
sNew[] = '$';
sNew[] = '#';
;
; i < len; i++){
sNew[j++] = s[i];
sNew[j++] = '#';
}
sNew[j] = '\0';
return j;
}
int Manacher()
{
int len = Init();
;
mx = ;
; i < len; i++){
* id - i], mx - i);
;
///在对象不是字符串时候,原本为了防止越界是左有'$'
///右有'\0',现在右边就没有'\0',需要人为填充替代!
while (sNew[i - p[i]] == sNew[i + p[i]]) p[i]++;
if (mx < i + p[i]){
id = i;
mx = i + p[i];
}
//max_len = max(max_len, p[i] - 1);
//// 如果题目不要求输出回文串在原串的位置,则用下面代码更新答案
if(max_len < p[i]){ ///这里L、R记录的是最长回文子串在原串的左右端点
max_len = p[i];
L = (i - p[i])>>;
R = (i + p[i] - )>>; ///R = (i + p[i])/2 -2;
}
}
return max_len;
/// 最后如若需要找到的回文串则是
/// for(int i=(id-mx+1);i<=(id+mx-1);i++)
/// if(sNew[i]!='#'&&sNew[i]!='$') ///注意你设置的开头符号和填充符号,不同则需要修改
/// putchar(sNew[i]);
}
];
int main(void)
{
char letter;
while(~scanf(" %c", &letter)){
int num = letter - 'a';
; i<; i++)
mp[(i+num)%] = i;
scanf("%s", s);
int len = strlen(s);
; i<len; i++) s[i] = mp[s[i]-'a']+'a';
){
printf("%d %d\n", L, R);
for(int i=L; i<=R; i++)
putchar(s[i]);
puts("");
}else puts("No solution!");
}
;
}
Manacher模板( 线性求最长回文子串 )的更多相关文章
- manacher算法_求最长回文子串长度
很好的总结,转自: http://blog.csdn.net/dyx404514/article/details/42061017 总结为:两大情况,三小情况. 两大情况:I. i <= p 1 ...
- manacher算法学习(求最长回文子串长度)
Manacher总结 我的代码 学习:yyb luogu题目模板 xzy的模板 #include<iostream> #include<cstdlib> #include< ...
- PAT甲题题解-1040. Longest Symmetric String (25)-求最长回文子串
博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789177.html特别不喜欢那些随便转载别人的原创文章又不给 ...
- hdu 3068 最长回文(manachar求最长回文子串)
题目连接:hdu 3068 最长回文 解题思路:通过manachar算法求最长回文子串,如果用遍历的话绝对超时. #include <stdio.h> #include <strin ...
- [hdu3068 最长回文]Manacher算法,O(N)求最长回文子串
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068 题意:求一个字符串的最长回文子串 思路: 枚举子串的两个端点,根据回文串的定义来判断其是否是回文 ...
- Manacher算法 求 最长回文子串
1 概述(扯淡) 在了解Manacher算法之前,我们得先知道什么是回文串和子串. 回文串,就是正着看反着看都一样的字符串.比如说"abba"就是一个回文串,"abbc& ...
- 后缀数组 - 求最长回文子串 + 模板题 --- ural 1297
1297. Palindrome Time Limit: 1.0 secondMemory Limit: 16 MB The “U.S. Robots” HQ has just received a ...
- Manacher算法 O(n) 求最长回文子串
转自:http://bbs.dlut.edu.cn/bbstcon.php?board=Competition&gid=23474 其实原文说得是比较清楚的,只是英文的,我这里写一份中文的吧. ...
- Manacher算法——求最长回文子串
首先,得先了解什么是回文串.回文串就是正反读起来就是一样的,如“abcdcba”.我们要是直接采用暴力方法来查找最长回文子串,时间复杂度为O(n^3),好一点的方法是枚举每一个字符,比较较它左右距离相 ...
随机推荐
- element_to_be_clickable(locator)
是等待页面元素可见的时候操作,会设置一定范围的时间,如果在时间范围内,元素可见,就 执行操作,元素不可见,就会引发TimeoutException的异常.如下是element_to_be_clicka ...
- 链路聚合teaming(网卡绑定技术)2
一.sentos7网卡绑定技术之teaming 这里介绍两种最常见的双网卡绑定模式: (1) roundrobin - 轮询模式 所有链路处于负载均衡状态,这种模式的特点增加了带宽,同时支持容错能力. ...
- 应用安全 - 平台 | 工具 - Nexus漏洞汇总
CVE-2019-5475 Date: 类型: RCE 影响范围: Nexus Repository Manager OSS <= Nexus Repository Manager Pro &l ...
- Vim常用的功能命令
一.编辑 查看行号 :set nu 删除一整行 dd 删除1到10行 :1,10d 删除所有内容 dG 当前行下插入一空行 o 撤销改动 u 查看当前行信息 ...
- 关于android工具链
1 android sdk platform tools 同android platform交互的工具,包括adb.fastboot和systrace. 2 sdk build tools 用于bui ...
- 由于;引发的Oracle的BadSqlExecption
一.在使用单引号进行各种转换合并的时候发生的异常: 1:首先单引号的表示符为 ' 在Oracle中如果SQL语句带上了分号是会报错的, 在SQL传入进行执行的时候会报BadSQLExecption,这 ...
- Codeforces 1262F Wrong Answer on test 233(组合数)
E1:设dp[i][j],表示在第i个位置的当前新状态超过原状态j分的方案数是dp[i][j],那么对于这种情况直接进行转移即可,如果a[i]==b[i]显然k种选择都可以,不影响j,如果不一样,这个 ...
- 实例学习——爬取豆瓣网TOP250数据
开发环境:(Windows)eclipse+pydev 网址:https://book.douban.com/top250?start=0 from lxml import etree #解析提取数据 ...
- kmeans 聚类 k 值优化
kmeans 中k值一直是个令人头疼的问题,这里提出几种优化策略. 手肘法 核心思想 1. 肉眼评价聚类好坏是看每类样本是否紧凑,称之为聚合程度: 2. 类别数越大,样本划分越精细,聚合程度越高,当类 ...
- 剑指offer-平衡二叉树-python
题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树. 思路: 平衡二叉树 (AVL)平衡二叉树是一种二叉排序树,其中每个结点的左子树和右子树的高度差至多等于1.它是一种高度平衡的二叉排序树.意思是 ...