字符串之manacher(马拉车)算法

news2024/9/25 15:27:25

这个算法用途就是查找字符串内的最长回文串

正常情况下,我们查找回文序列,会去用双指针比较,这样的话数据大的时候,时间复杂度就上去了,其实这个马拉车算法和kmp算法的一部分是有些相像的,建议先看我的上篇文章kmp算法https://blog.csdn.net/2301_79646104/article/details/136353382?spm=1001.2014.3001.5501

在kmp算法中,最关键的点就是去回跳 j 指针,在马拉车算法中也是,为了 查找回文序列,我们引入一个概念叫做回文半径,它的意思是,比如aabaa,那么它的回文半径就是3

aba回文半径就是1

马拉车算法第一步:改造字符串

在字符之间和串两端插入#,改造后,都会变成奇回文串,方便统一处理

s[0]='$'是边界

scanf("%s",a+1)
int n=strlen(a+1),k=0;
s[0]='$';s[++k]='#';
for(int i=0;i<n;i++){
   s[++k]=a[i],s[++k]='#';
}
n=k;//别忘了数组长度变了

第二步就是来找最长回文半径了

我们定义d[i]为以 i 为中心的回文半径

void get(char*s,int n){
  d[1]=1;
  for(int i=2,l,r=1;i<=n;i++){
     if(i<=r)d[i]=min(d[r-i+1],r-i+1);
     while(s[i-d[i]]==s[i+d[i]])d[i]++;
     if(i+d[i]-1>r)l=i-d[i]+1,r=i+d[i]-1;
     }
  }

这步其实就是构建了一个加速盒子:

计算完前 i -1个d函数,维护盒子[l,r]

1,如果 i 《= r (在盒内),i 的对称点就是 r -i +1

   (1)若d[r- i +1]<=r-i +1,d[i]=d[r- i +1]

   (2)若d[r- i +1]>=r-i +1,d[i]=r-i +1   从r+1往后暴力枚举

2,如果 i >r,则从 i 开始暴力枚举

3,求出d[i]后,如果 i +d[i] -1>r,则更新盒子为l=i-d[i]+1,r=i+d[i]-1;

来道例题

P3805 【模板】manacher

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int N=3e7;
char a[N],s[N];
int d[N]; //回文半径函数 
int ans;

int main(){
  //改造串
  scanf("%s",a+1);
  int n=strlen(a+1),k=0;
  s[0]='$',s[++k]='#';        
  for(int i=1;i<=n;i++) {
    s[++k]=a[i],s[++k]='#';}
  n=k;
  
  d[1]=1;
    for(int i=2,l,r=1;i<=n;i++){
        if(i<=r)d[i]=min(d[r-i+l],r-i+1);
        while(s[i-d[i]]==s[i+d[i]])d[i]++;
        if(i+d[i]-1>r)l=i-d[i]+1,r=i+d[i]-1;
        if(d[i]>ans)ans=d[i];
        // printf("i=%d d=%d [%d %d]\n",i,d[i],l,r);
    }  
  
  
  printf("%d\n",ans-1);
  return 0;
}

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

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

相关文章

00X集——acdbpolyline与acdb2dpolyline区别

下图中选择的线为通过ThisDrawing.ModelSpace.AddPolyline(points)创建的&#xff0c;包含2个点 通过代码查询objectname,如下图acdb2dpolyline ObjectARX 中提供了三种多段线的相关类:AcDbPolyline 、AcDb2dPolyline 和 AcDb3dPolyline 。其中&#xff0c;利用AutoCAD 的内部…

【Java项目介绍和界面搭建】拼图小游戏——打乱图片顺序

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏 …

现代化数据架构升级:毫末智行自动驾驶如何应对年增20PB的数据规模挑战?-OceanBase案例

毫末智行是一家致力于自动驾驶的人工智能技术公司&#xff0c;其前身是长城汽车智能驾驶前瞻分部&#xff0c;以零事故、零拥堵、自由出行和高效物流为目标&#xff0c;助力合作伙伴重塑和全面升级整个社会的出行及物流方式。 在自动驾驶领域中&#xff0c;是什么原因让毫末智行…

力扣601 体育馆的人流量

在解决"连续三天及以上人流量超过100的记录"问题时&#xff0c;MySQL方案作为力扣解决问题的方案通过窗口函数和分组技巧高效地识别连续记录。而Python与Pandas方案作为扩展则展示了在数据处理和分析方面的灵活性&#xff0c;通过行号变换和分组计数来筛选符合条件的…

unity学习(46)——服务器三次注册限制以及数据库化角色信息1--数据流程

1.先找到服务器创建角色信息代码的位置&#xff0c;UserBizImpl.cs中&#xff1a; public PlayerModel create(string accId, string name, int job) {PlayerModel[] playerModelArray this.list(accId);//list是个自建函数&#xff0c;本质通过accId来查询if (playerModelAr…

【机器人最短路径规划问题(栅格地图)】基于模拟退火算法求解

代码获取方式&#xff1a;QQ&#xff1a;491052175 或者 私聊博主获取 基于模拟退火算法求解机器人最短路径规划问题&#xff08;栅格地图&#xff09;的仿真结果 仿真结果&#xff1a; 初始解的路径规划图 收敛曲线&#xff1a; 模拟退火算法求解的路径规划图 结论&#xff…

笨办法学 Python3 第五版(预览)(一)

原文&#xff1a;Learn Python the Hard Way, 5th Edition (Early Release) 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 模块 1&#xff1a;Python 入门 练习 0&#xff1a;准备工作 这个练习没有代码。这只是你完成的练习&#xff0c;让你的计算机运行 Python。…

视频编码面试基础题

视频基础知识&#xff1a; RGB彩色原理&#xff1a; RGB是指光学三原色红、绿和蓝&#xff0c;通过这3种的数值&#xff08;0-255&#xff09;改变可以组成其他颜色&#xff0c;全0时为黑色&#xff0c;全255时为白色。RGB是一种依赖于设备的颜色空间&#xff1a;不同设备对特定…

非阻塞IO:提高应用程序的效率与性能

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

[unity]lua热更新——个人复习笔记【侵删/有不足之处欢迎斧正】

一、AssetBundle AB包是特定于平台的资产压缩包&#xff0c;类似于压缩文件 相对于RESOURCES下的资源&#xff0c;AB包更加灵活轻量化&#xff0c;用于减小包体大小和热更新 可以在unity2019环境中直接下载Asset Bundle Browser 可以在其中设置关联 AB包生成的文件 AB包文件…

码垛工作站:食品生产企业的转型助推器

在当今高度自动化的工业生产中&#xff0c;码垛工作站的应用正逐渐成为一种趋势。某食品生产企业在面临市场竞争加剧、人工成本上升等多重压力下&#xff0c;决定引入码垛工作站&#xff0c;以期实现生产流程的升级与变革。 一、码垛工作站引入背景 该企业主要从事休闲食品的…

Github 2024-03-03 开源项目日报Top9

根据Github Trendings的统计&#xff0c;今日(2024-03-03统计)共有9个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量非开发语言项目4Rust项目1C项目1Jupyter Notebook项目1Python项目1Shell项目1 任天堂Switch模拟器yuzu&#x…

云计算市场,从追求“规模制胜”到走向“用户分化”

文|智能相对论 作者|叶远风 通常来说&#xff0c;价格战放到任何行业&#xff0c;都不是什么好事。 如今&#xff0c;作为曾经的前沿技术创新&#xff0c;云计算行业正在被迫走入价格战的阴霾当中&#xff0c;引发业界担忧。 ECS&#xff08;云服务器&#xff09;最高降36%…

559.n叉树的最大深度

这段代码是一个Java类Solution&#xff0c;其中包含一个公共方法maxDepth&#xff0c;用于计算一个二叉树的最大深度。这里的二叉树是一个特殊的数据结构&#xff0c;其中每个节点Node可能有一个或多个子节点&#xff08;在这里被称为children&#xff09;。下面是对代码的详细…

Manomotion 实现AR手势互动-解决手势无效的问题

之前就玩过 Manomotion &#xff0c;现在有新需求&#xff0c;重新接入发现不能用了&#xff0c;不管什么办法&#xff0c;都识别不了手势&#xff0c;我记得当初是直接调用就可以的。 经过研究发现&#xff0c;新版本SDK改了写法。下边就写一下新版本的调用&#xff0c;并且实…

FRM模型十四:FRA估值

什么是FRA FRA&#xff08;Forward rate agrreement&#xff09;远期利率协议&#xff0c;是一种场外衍生品。FRA在0时刻确定&#xff0c;在未来时刻进行交易的协议。例如FRA3,6表示双方约定在3个月后以Rk的利率水平借款3个月。 应用场景&#xff1a;某公司未来3个月有融资需…

政安晨【示例演绎虚拟世界开发】(六):从制作一个对战小游戏开始(Cocos Creator 《击败老大》)(第三段)

在上一篇文章中&#xff0c;我们已经将游戏的场景基本搭建完毕&#xff0c;接下来我们就可以为游戏编写代码并实现相关的核心逻辑了。 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: AI虚拟世界大讲堂 希望政安晨的博客能够对您有所裨益&a…

多层感知机 + 代码实现 - 动手学深度学习v2 | 李沐动手学深度学习课程笔记

感知机 感知机≈二分类问题 感知机和其他问题的对比 训练感知机 如果小于等于零&#xff0c;说明预测错啦 &#xff0c;其实就是同号为正&#xff0c;异号为负 举个分类的例子 增加样本&#xff0c;改变分类线 继续分类 感知机的收敛定理 XOR问题 XOR问题其实就是第1、3象限数…

前端学习第七天-css常用样式设置

达标要求 掌握元素的显示与隐藏 熟练应用溢出的文字隐藏 熟练掌握版心和布局流程 1. 元素的显示与隐藏 在CSS中有三个显示和隐藏的单词比较常见&#xff0c;我们要区分开&#xff0c;他们分别是 display visibility 和 overflow。 他们的主要目的是让一个元素在页面中消失…

外包干了6个月,技术退步明显

先说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入广州某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…