AcWing 3188:Manacher 算法 → 最长回文子串

news2024/11/29 18:45:17

【题目来源】
https://www.acwing.com/problem/content/3190/

【题目描述】
给定一个长度为 n 的由小写字母构成的字符串,求它的
最长回文子串的长度是多少。

【输入格式】
一个由小写字母构成的字符串。

【输出格式】
输出一个整数,表示最长回文子串的长度。

【数据范围】
1≤n≤10^7

【输入样例】
abcbabcbabcba

【输出样例】
13

【算法分析】
Manacher算法,谐称
马拉车算法,是用于在 O(n) 时间复杂度内找到字符串中最长回文子串的高效算法。核心内容如下。

★ 基于原字符串 a 生成由特殊字符分割的字符串 b
方法:在原字符串 a 的
首尾及每两个相邻字符间插入未在原串中出现的字符作为分隔符。分隔符的选择依据是其未在原串中出现,通常可以选择 # 号。如果原字符串中有 # 号,就需要插入其他未在原串中出现的分隔符。此外,为了避免在搜索回文子串时总是判断是否越界,通常在原字符串 a 的首端加 $ 号,在尾端加 ^ 号等原串中未出现的特殊字符。

void init() {
    int k=0;
    b[k++]='$', b[k++]='#';
    for(int i=0; i<n; i++) b[k++]=a[i],b[k++]='#';
    b[k++]='^';
    n=k;
}

例如,若原字符串为“google”,那么插入分隔符 # 及 $、^ 之后,变为了“$#g#o#o#g#l#e#^”。

意义:在设计 Manacher 算法时,可以统一考虑为作用于包含
奇数个字符的字符串。这是因为插入的分隔符的个数,如 # 号的个数一定等于原字符串 a 中的字符个数+1,因此插入分隔符 # 后所得的字符串中的字符个数为“偶数+奇数=奇数”。再加上 $、^ 两个字符后,生成的字符串 b 中的字符个数仍然为奇数。换种说法,即这样处理后,使得原串 a 中的任意回文串在 b 串中都表示为奇数长度串的形式,且都有一个中心点

★ Manacher 算法主要内容解析
p[i] 表示以字符串第 i 位为中心的回文串的最大半径。
mr 为之前得到的最长回文子串的右端点位置的最大值,并且设取得这个最大值的回文子串的中心位置为 mid,分两种情况讨论:
第一种情况:
i>mr
如果 i>mr,说明以 i 为中心的回文串还没有进行匹配。此时,p[i]=1,然后开始匹配,匹配完成后更新 mr 和对应的 mid 以及 p[i]。

第二种情况:i<=mr
(1)p[i]<mr−i
下图中 2*mid-mr 是 mr 关于 mid 的对称点,j 是 i 关于 mid 的对称点,可知 j = 2*mid - i
且据 p[i]<mr−i, 可知 i 的回文区域(i 附近的黄色区域部分)位于
之前求得的 mid 的回文区域 [2*mid-mr, mr] 的内部,为了满足回文串的对称性,故其必与已经求得的 j 的回文区域(j 附近的黄色区域部分)相同且关于 mid 对称,此时 p[i]=p[j]=p[2*mid-i]

(2)p[i]>=mr−i
由对称性,说明以 i 为中心的回文串可能会延伸到 mr 之外。而大于 mr 的部分还没有进行匹配,所以要从 mr+1 位置开始一个一个进行匹配,直到发生失配。然后更新 mr 和对应的 mid 以及 p[i]。此时,p[i]=mr-i

所以,在 i<=mr 的条件下,p[i]=min(p[mid+mid-i],mr-i)
综上,可得求 p[i] 的核心代码如下所示。

if(i<=mr) p[i]=min(p[mid+mid-i],mr-i);
else p[i]=1;

【算法代码】

#include <bits/stdc++.h>
using namespace std;

const int maxn=2e7+5;
char a[maxn],b[maxn];
int p[maxn];
int n;

void init() {
    int k=0;
    b[k++]='$', b[k++]='#';
    for(int i=0; i<n; i++) b[k++]=a[i],b[k++]='#';
    b[k++]='^';
    n=k;
}

void manacher() {
    int mr=0;
    int mid=0;
    for(int i=0; i<n; i++) {
        if(i<=mr) p[i]=min(p[mid+mid-i],mr-i);
        else p[i]=1;

        while(b[i-p[i]]==b[i+p[i]]) p[i]++;

        if(i+p[i]>mr) {
            mr=i+p[i];
            mid=i;
        }
    }
}

int main() {
    cin>>a; //scanf("%s", a);
    n=strlen(a);

    init();
    manacher();

    int ans=0;
    for(int i=0; i<n; i++) ans=max(ans,p[i]-1);
    cout<<ans<<endl;

    return 0;
}


/*
in:
abcbabcbabcba

out:
13
*/


 



【参考文献】
https://www.cnblogs.com/cloudplankroader/p/10988844.html
https://www.acwing.com/file_system/file/content/whole/index/content/9348088/
https://www.acwing.com/solution/content/66912/

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2215720.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VSCode创建插件HelloWorld找不到指令解决办法

按照网上的教程执行yo code并且生成成功 但是F5打开调试新窗口后&#xff0c;ctrl shift P&#xff0c;输入helloworld并没有指令提示 原因&#xff1a;当前电脑安装的VSCode版本过低&#xff0c;不支持当前插件的使用&#xff08;因为自动生成的插件总是默认使用最新版VSC…

00 springboot项目创建

我们创建SpringBoot项目有两种方式: Spring Initializr spring initerzie 方式创建: 启动类, 依赖 生成,但是需要网络maven的方式 maven方式创建: 启动类, 依赖, 这些都需要手动编写,但是不需要网络 如果你觉得我分享的内容或者我的努力对你有帮助&#xff0c;或者你只是想表…

可看见车辆行人的高清实时视频第5辑

我们在《看见车辆行人的高清实时视频第4辑》分享了10处可看见车辆行人的实时动态高清视频。 现在我们又整理10处为你分享可看见车辆行人的实时动态高清视频&#xff0c;一共有50个摄像头数据&#xff0c;这些视频来自公开的高清摄像头实时直播画面。 我们在文末为你分享了这些…

制造业如何从0-1实现信息化建设?

深度长文&#xff0c;4000 字&#xff0c;融合了众多企业的实践经验和行业观点&#xff0c;一文讲清制造业信息化建设的路径&#xff0c;心急的小伙伴可以先看目录&#xff1a; 关于定义 —— 制造业信息化建设是什么&#xff1f;关于价值 —— 为什么制造业要进行信息化建设…

【C++】精妙的哈希算法

&#x1f680;个人主页&#xff1a;小羊 &#x1f680;所属专栏&#xff1a;C 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 一、哈希结构1、哈希概念2、哈希函数3、哈希冲突3.1 闭散列3.2 开散列 4、完整代码 一、哈希结构 1、哈希概念 A…

漏扫工具Appscan使用(非常详细)从零基础入门到精通,看完这一篇就够了。

1、简介 AppScan是一款商业化的web安全扫描工具&#xff0c;web扫描领域十分受欢迎 2、具体使用规则 1、常用界面 新建扫描文件 选择扫描 对于第一种扫描方式&#xff1a; 设置url和服务器 登录管理&#xff1a;对于需要登陆的页面&#xff08;这种方法不允许有验证码&#…

人工智能AI与机器学习ML基础入门

小学生都能看懂的人工智能入门书籍 第一章 入门简介 TensorFlow 入门 如果你想入门人工智能&#xff08;AI&#xff09;&#xff1f;机器学习&#xff08;ML&#xff09;和深度学习是很好的起点。不过&#xff0c;一开始接触这些概念时&#xff0c;可能会被各种选项和新术语搞…

关于Spring Framework路径遍历漏洞(CVE-2024-38816)的预警提示和修复方案

一、漏洞详情 Spring Framework是一个Java应用程序框架&#xff0c;旨在提供高效且可扩展的开发环境。 近日&#xff0c;监测到Spring Framework中修复了一个路径遍历漏洞&#xff08;CVE-2024-38816&#xff09;。Spring Framework受影响版本中&#xff0c;使用WebMvc.fn 或…

MyBatisCodeHelperPro一直用教程

qq群&#xff1a;984518344 不懂请留言&#xff01;&#xff01;&#xff01; &#xff08;有能力请请支持正版&#xff01;&#xff01;&#xff09; &#xff08;仅供学习交流&#xff0c;严禁用于商业用途&#xff0c;请于24小时内删除&#xff01;&#xff01;&#xff09…

使用标注工具并跑通官方yolov8分割segment自己的数据集

1.下载标注工具用于打标签 使用标注工具&#xff0c;后面会用到智能标注 点击 创建AI多边形后命令行就自动下载对应的模型 单机要选中的图像就行&#xff0c;就可以智能选中&#xff0c;双击设置标签 依次标注所有图片 &#xff0c;最后保存成json格式的文件 2.使用labelme2y…

Nuxt.js 应用中的 modules:before 事件钩子详解

title: Nuxt.js 应用中的 modules:before 事件钩子详解 date: 2024/10/15 updated: 2024/10/15 author: cmdragon excerpt: modules:before 是 Nuxt.js 中一个重要的生命周期钩子,在 Nuxt 应用初始化期间被触发。该钩子允许开发者在安装用户定义的模块之前执行某些操作,如…

交通目标识别数据集YOLO 模型 ui界面✓图片数量15000,xml和txt标签都有 11类 交通道路车辆行人红黄绿数据集 红绿灯数据集 交通信号数据集

YOLO交通目标识别 数据集 模型 ui界面 ✓图片数量15000&#xff0c;xml和txt标签都有&#xff1b; ✓class&#xff1a;biker&#xff0c;car&#xff0c;pedestrian&#xff0c;trafficLight&#xff0c;trafficLight-Green&#xff0c;trafficLight-GreenLeft&#xff0c; tr…

WPF中MVVM的应用举例

WPF&#xff08;Windows Presentation Foundation&#xff09;是微软开发的用于创建用户界面的框架&#xff0c;而MVVM&#xff08;Model-View-ViewModel&#xff09;模式是一种分离前端UI逻辑与后台业务逻辑的方法。在WPF中使用MVVM模式可以提高代码的可维护性、可测试性和可扩…

Vant 日期时间组件拓展

基于 "vant": "^4.8.3", 效果图 <template><!-- 弹出层 --><van-popupv-model:show"isPicker"position"bottom"><van-pickerref"picker":title"title"v-model"selectedValues"…

匿名管道和命名管道

目录 管道 pipe创建一个管道 让子进程写入&#xff0c;父进程读取 如何把消息发送/写入给父进程 父进程该怎么读取呢 管道本质 结论&#xff1a;管道的特征&#xff1a; 测试管道大小 写端退了&#xff0c;测试结果 测试子进程一直写&#xff0c;父进程读一会就退出 …

PAT甲级-1076 Forwards on Weibo

题目 题目大意 已知微博上粉丝都可能会转发自己所关注的人的动态&#xff0c;给定总人数n和层数l&#xff0c;和每个id关注的人数及所关注人的id。要求查询一组用户的潜在转发量&#xff0c;粉丝层级不能超过l。 思路 求潜在转发量&#xff0c;就是一层一层的找粉丝数&#…

【已知当前表字段名注入】

一、通配符注入 like 测试注入 usernameadmin&passwordadmin 提示username or password error输入单引号闭合测试 这里用or防止admin字段不存在数据库中&#xff0c;如果admin不存在用and连接admin不为真&#xff0c;username的逻辑还是没绕过&#xff0c;用or就算我们前面…

嵌入式Linux开发板配置静态IP

嵌入式Linux开发板配置静态IP Chapter1 嵌入式Linux开发板配置静态IPChapter2 Linux命令之hwclock - 查询和设置硬件时钟 Chapter1 嵌入式Linux开发板配置静态IP 修改interfaces配置文件&#xff0c;普通用户interfaces文件权限只可读&#xff0c;首先切换到root权限。 sudo …

vue单页面 与多页面的区别

引用&#xff08;【Vue相关】单页面应用(SPA)与多页面应用(MPA)的区别_vue mpa-CSDN博客&#xff09; 只要用框架基本上都是单页面工程