hihocoder 1032 最长回文子串 (Manacher算法 详解+模板)

2024-03-20 13:38

本文主要是介绍hihocoder 1032 最长回文子串 (Manacher算法 详解+模板),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

时间限制:1000ms
单点时限:1000ms
内存限制:64MB

描述

   小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进。

   这一天,他们遇到了一连串的字符串,于是小Hi就向小Ho提出了那个经典的问题:“小Ho,你能不能分别在这些字符串中找到它们每一个的最长回文子串呢?”

   小Ho奇怪的问道:“什么叫做最长回文子串呢?”

   小Hi回答道:“一个字符串中连续的一段就是这个字符串的子串,而回文串指的是12421这种从前往后读和从后往前读一模一样的字符串,所以最长回文子串的意思就是这个字符串中最长的身为回文串的子串啦~”

   小Ho道:“原来如此!那么我该怎么得到这些字符串呢?我又应该怎么告诉你我所计算出的最长回文子串呢?

   小Hi笑着说道:“这个很容易啦,你只需要写一个程序,先从标准输入读取一个整数N(N<=30),代表我给你的字符串的个数,然后接下来的就是我要给你的那N个字符串(字符串长度<=10^6)啦。而你要告诉我你的答案的话,只要将你计算出的最长回文子串的长度按照我给你的顺序依次输出到标准输出就可以了!你看这就是一个例子。”

提示一提示二提示三提示四
样例输入
3
abababa
aaaabaa
acacdas
样例输出
7
5
3 

题目链接:http://hihocoder.com/problemset/problem/1032


题目分析:Manacher算法可以在O(n)的时间复杂度内解决最长回文子串问题,下面介绍一下这个算法

首先对于一个任意长度的字符串,通过插入无关字符法均可以将其变成奇数长度,如aba => #a#b#a#,abba => #a#b#b#a#,为了解决边界问题可以直接在最前面再加上一个无关字符,令cur为当前能延伸到最右端的回文子串的中心位置,p[cur]表示当前能延伸到最右端的回文子串的回文半径,而p[cur] + cur就是当前能延伸到的最右端,当前位置i如果在其范围之外,即p[cur] + cur < i则p[i] = 1(自己另起一段回文子串),如果p[cur] + cur >= i,也就是当前位置在其范围内,则此时p[i] = min(p[cur * 2 - i],p[cur] + cur - i),这里分两种情况,1) p[cur * 2 - i] > p[cur] + cur - i,也就是说以i当前的对称点为中心的回文子串范围在当前cur为中心的回文子串的最左端的左边,则这时p[i] = p[cur] + cur - i;p[cur] + cur - i指的是当前cur为中心的回文串的最右端到当前点i的距离,2) p[cur * 2 - i] <= p[cur] + cur - i,情况类似上面,画图很容易看出来,算出p[i],则以当前的i为中心向两端扩展,若扩展出来的最右端超过原来的最右端则更新cur

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int const MAX = 1e6 + 5;
char s[MAX << 1];
int p[MAX << 1];int Manacher()
{int len = strlen(s);for(int i = len; i >= 0; i--){s[(i << 1) + 2] = s[i];s[(i << 1) + 1] = '#';}s[0] = '*';int cur = 0, ans = 0;for(int i = 2; i < 2 * len + 1; i++){if(p[cur] + cur >= i)p[i] = min(p[(cur << 1) - i], p[cur] + cur - i);elsep[i] = 1;while(s[i - p[i]] == s[i + p[i]])p[i] ++;if(p[cur] + cur < i + p[i])cur = i;ans = max(ans, p[i]);}return ans - 1;
}int main()
{int n;scanf("%d", &n);while(n --){scanf("%s", s);printf("%d\n", Manacher());}
}


这篇关于hihocoder 1032 最长回文子串 (Manacher算法 详解+模板)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/829617

相关文章

Java中注解与元数据示例详解

《Java中注解与元数据示例详解》Java注解和元数据是编程中重要的概念,用于描述程序元素的属性和用途,:本文主要介绍Java中注解与元数据的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参... 目录一、引言二、元数据的概念2.1 定义2.2 作用三、Java 注解的基础3.1 注解的定义3.2 内

JavaScript中的isTrusted属性及其应用场景详解

《JavaScript中的isTrusted属性及其应用场景详解》在现代Web开发中,JavaScript是构建交互式应用的核心语言,随着前端技术的不断发展,开发者需要处理越来越多的复杂场景,例如事件... 目录引言一、问题背景二、isTrusted 属性的来源与作用1. isTrusted 的定义2. 为

使用Python实现操作mongodb详解

《使用Python实现操作mongodb详解》这篇文章主要为大家详细介绍了使用Python实现操作mongodb的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、示例二、常用指令三、遇到的问题一、示例from pymongo import MongoClientf

一文详解Python中数据清洗与处理的常用方法

《一文详解Python中数据清洗与处理的常用方法》在数据处理与分析过程中,缺失值、重复值、异常值等问题是常见的挑战,本文总结了多种数据清洗与处理方法,文中的示例代码简洁易懂,有需要的小伙伴可以参考下... 目录缺失值处理重复值处理异常值处理数据类型转换文本清洗数据分组统计数据分箱数据标准化在数据处理与分析过

详解如何在React中执行条件渲染

《详解如何在React中执行条件渲染》在现代Web开发中,React作为一种流行的JavaScript库,为开发者提供了一种高效构建用户界面的方式,条件渲染是React中的一个关键概念,本文将深入探讨... 目录引言什么是条件渲染?基础示例使用逻辑与运算符(&&)使用条件语句列表中的条件渲染总结引言在现代

详解Vue如何使用xlsx库导出Excel文件

《详解Vue如何使用xlsx库导出Excel文件》第三方库xlsx提供了强大的功能来处理Excel文件,它可以简化导出Excel文件这个过程,本文将为大家详细介绍一下它的具体使用,需要的小伙伴可以了解... 目录1. 安装依赖2. 创建vue组件3. 解释代码在Vue.js项目中导出Excel文件,使用第三

SQL注入漏洞扫描之sqlmap详解

《SQL注入漏洞扫描之sqlmap详解》SQLMap是一款自动执行SQL注入的审计工具,支持多种SQL注入技术,包括布尔型盲注、时间型盲注、报错型注入、联合查询注入和堆叠查询注入... 目录what支持类型how---less-1为例1.检测网站是否存在sql注入漏洞的注入点2.列举可用数据库3.列举数据库

Linux之软件包管理器yum详解

《Linux之软件包管理器yum详解》文章介绍了现代类Unix操作系统中软件包管理和包存储库的工作原理,以及如何使用包管理器如yum来安装、更新和卸载软件,文章还介绍了如何配置yum源,更新系统软件包... 目录软件包yumyum语法yum常用命令yum源配置文件介绍更新yum源查看已经安装软件的方法总结软

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

Java访问修饰符public、private、protected及默认访问权限详解

《Java访问修饰符public、private、protected及默认访问权限详解》:本文主要介绍Java访问修饰符public、private、protected及默认访问权限的相关资料,每... 目录前言1. public 访问修饰符特点:示例:适用场景:2. private 访问修饰符特点:示例: