马拉车 Manacher

news/2025/2/28 20:16:56/文章来源:https://www.cnblogs.com/HarlemBlog/p/18686407
更新日志 2025/01/22:开工。

思路

马拉车算法用于解决回文子串问题,思路类似于Z函数。

首先我们考虑使所有回文串都是奇数串,具体的,我们在两两字符之间插入相同的特殊字符,比如:

\[\texttt{abcba}\rightarrow\texttt{\#a\#b\#c\#b\#a\#} \]

不难发现此时所有回文串串长均为奇数。

类似地,我们考虑 \(p_i\) 表示 \(i\) 为中心最长回文串的半长,储存最大的 \(i+p_i-1\)(我令 \(p_i\) 包含中心字符),将这段半长的左右端点记作 \(l,r\)

image

首先,一个位置 \(i\) 的对应位置为 \(j=2l-i\),简单推式子。

\(p_j\) 不超过整个红框的左边界,由于整个红框都是回文串,那么 \(p_i=p_j\)

否则,我们暴力向外扩展即可。

细节

更改字符串,如果使用加法,请使用 += 而不是 = +,因为后者复杂度是 \(O(|A|+|B|)\) 的。

模板

(当前字符串为中心的最长回文串长度为 \(p_i-1\)

int p[N],l,r;
void manacher(string t){string s="#";repl(i,0,t.size())s+=t[i],s+='#';p[0]=1;l=r=0;int len=s.size();repl(i,1,len){if(i<=r&&p[l-(i-l)]<r-i+1)p[i]=p[l-(i-l)];else p[i]=max(1,r-i+1);while(i+p[i]<len&&i-p[i]>=0&&s[i+p[i]]==s[i-p[i]])p[i]++;if(i+p[i]-1>r)r=i+p[i]-1,l=i;}
}

例题

LG3805

代码
#include<bits/stdc++.h>
using namespace std;typedef long long ll;
typedef unsigned long long ull;
typedef __int128 i128;
typedef double db;
typedef long double ld;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef pair<int,ll> pil;
typedef pair<ll,int> pli;
template <typename Type>
using vec=vector<Type>;
template <typename Type>
using grheap=priority_queue<Type>;
template <typename Type>
using lrheap=priority_queue<Type,vector<Type>,greater<Type> >;
#define fir first
#define sec second
#define pub push_back
#define pob pop_back
#define puf push_front
#define pof pop_front
#define chmax(a,b) a=max(a,b)
#define chmin(a,b) a=min(a,b)
#define rep(i,x,y) for(int i=(x);i<=(y);i++)
#define repl(i,x,y) for(int i=(x);i<(y);i++)
#define per(i,x,y) for(int i=(x);i>=(y);i--)const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;
const int mod=998244353;const int N=2.2e7+5;string s;
int ans=1;int p[N],l,r;
void manacher(string t){string s="#";repl(i,0,t.size())s+=t[i],s+='#';p[0]=1;l=r=0;int len=s.size();repl(i,1,len){if(i<=r&&p[l-(i-l)]<r-i+1)p[i]=p[l-(i-l)];else p[i]=max(1,r-i+1);while(i+p[i]<len&&i-p[i]>=0&&s[i+p[i]]==s[i-p[i]])p[i]++;if(i+p[i]-1>r)r=i+p[i]-1,l=i;chmax(ans,p[i]-1);}
}int main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>s;manacher(s);cout<<ans;return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

折腾笔记[10]-使用rust进行ORB角点检测

打包ORB算法到bye_orb_rs库,使用rust进行ORB角点检测. Package the ORB algorithm into the bye_orb_rs library, and use Rust for ORB corner detection.摘要 打包ORB算法到bye_orb_rs库,使用rust进行ORB角点检测. Package the ORB algorithm into the bye_orb_rs library, a…

DBSyncer开源数据同步中间件

一、简介 DBSyncer(英[dbsɪŋkɜː(r)],美[dbsɪŋkɜː(r) 简称dbs)是一款开源的数据同步中间件,提供MySQL、Oracle、SqlServer、PostgreSQL、Elasticsearch(ES)、Kafka、File、SQL等同步场景。支持上传插件自定义同步转换业务,提供监控全量和增量数据统计图、应用性能预…

幻想 实在 自我

小 C 和 小 Y 的故事还未停止 …… 或许不会停止弥晨时间仓促,如有错误欢迎指出,欢迎在评论区讨论,如对您有帮助还请点个推荐、关注支持一下

AT+CSQ 和 AT+QENG查询的 RSSI不一致

1. 查询结果如下:2. CSQ查询的RSSI 接收信号强度指示时是31,对应但是 AT+QENG查询的是-128

记录printf的一个小问题

因为打算使用sprintf来格式化字符串,然后显示,遇到了一个符号类型的问题 printf("%d",now_adc);这一句,如果now_adc是uchar类型,输出字符会显示异常,后来了解到,如果要直接打印uchar只能用%x或者%s 所以如果不想改变量大小可以在前面加括号强转如printf("…

工业人工智能白皮书2025年:边缘AI驱动,助力新质生产力报告汇总PDF洞察(附原数据表)

原文链接:https://tecdat.cn/?p=38940 在当前科技变革的浪潮中,工业领域正经历着深刻转型。人工智能与工业互联网等前沿技术的迅猛发展,为工业的升级演进带来了前所未有的机遇与挑战。 本报告汇总洞察聚焦工业领域的变革趋势,深入剖析其核心驱动力与发展脉络。通过对工业 …

【视频】R语言支持向量分类器SVM原理及房价数据预测应用及回归、LASSO、决策树、随机森林、GBM、神经网络对比可视化

全文链接: https://tecdat.cn/?p=38830 原文出处:拓端数据部落公众号 分析师:Yuqi Liu 在大数据时代,精准的数据分类与预测对各领域的发展至关重要。超平面作为高维空间中的关键概念,可将线性空间一分为二,为数据分类奠定了理论基石。基于此发展而来的最大边缘分类器,…

【信息化】一个IT主管/经理/总监的该做什么?-读图解 CIO 工作指南上半IT管理总结

在这个IT人日益技术焦虑的年代,为了缓解一下学习的焦虑,看各路推荐开始学习一下《图解CIO工作指南》。我的初衷很简单,学习一下IT架构设计的思路,日常IT管理工作怎么优化,以及未来MBA毕业写IT规划论文。 一开始,当我拿到这本看似“老旧”的书籍时,心里确实犯了点嘀咕…

LCD-RGB屏幕学习(二)ESP32驱动RGB屏幕

ESP32是国内比较火的IOT芯片厂商,在个人玩家圈子里备受好评1.器件准备40pin RGB 通用接口屏幕这里的通用接口指的是市面上最常见的接口,并不属于某种标准 我拆开了吃灰已久的树莓派便携HDMI屏幕,在屏库上查看此型号,刚好满足需求,又剩下一笔大洋ESP32N16R8选用带有pasram的…

OM6621F低功耗低成本蓝牙芯片支持BLE5.1和2.4G私有协议集成了电源管理单元(PMU)BMS电池管理领域首选方案

OM6621Fx是一款专为蓝牙低功耗和专有2.4GHz应用设计的功率优化的真系统级芯片(SOC)解决方案。它集成了高性能和低功率的射频收发器,具有蓝牙基带和丰富的外围I0扩展。OM6621Fx还集成了电源管理单元(PMU),以实现高效率的电源管理。它针对2.4GHz蓝牙低功耗系统、专有2.4GHz系统…

Jetpack架构组件学习(6)——使用Glance实现桌面小组件

原文地址: Jetpack架构组件学习(6)——使用Glance实现桌面小组件-Stars-One的杂货小窝公司陆续整了几个Compose写的app,有个小组件的功能,顺便试了下Jetpack库里的Glance框架 感觉与原来的Remoteview差点意思,不过点击事件的使用比Remoteview要方便不少PS: 如果想看Remoteview实…

《操作系统真象还原》第九章 线程(二) 多线程轮转调度

本文是对《操作系统真象还原》第九章(二)学习的笔记,欢迎大家一起交流第九章 线程(二) 多线程轮转调度 本文是对《操作系统真象还原》第九章(二)学习的笔记,欢迎大家一起交流,目前所有代码已托管至 fdx-xdf/MyTinyOS 。 上一节中成功创建了线程并运行,这一节要实现的…