Manacher算法

Manacher算法详解
本文深入讲解Manacher算法,一种高效求解最长回文子串问题的线性算法。通过实例和代码,阐述算法原理及其实现步骤,适合初学者理解和掌握。

Manacher算法

爆肝计划

我是个只会暴力的小蒟蒻,每天面临着许多超时问题/(ㄒoㄒ)/~~

有一天,我刷着题,超时了,大佬看了说了一声:马拉车。我想了想,马不是一直拉车吗?肯定在开玩笑。

直到他让我去学学,我才知道是这个马拉车ಥ_ಥ。

  1. 马拉车主要应用在求一个字符串中最长的子字符串的长度,马拉车是个奇妙的算法,他巧妙的利用了线性思维解题,但是它又是局限性极高的算法,他只能解决这一类问题ㄟ( ▔, ▔ )ㄏ,所以他问的题像马拉车,那么解法一定是马拉车,不多说了

  2. 首先我们先想一个问题,我们如何将一个字符串的长度变成奇数?我相信你们肯定知道2n+1吧,那么我们怎么 做呢?很简单,就在这个字符串中间加上这个字符串所没有的单个字符就可以了。

  3. 那么接下来看图(字丑见谅)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上模板吧

#include<bits/stdc++.h>
using namespace std;
const int N=23000005;
char s[N],news[N];
int p[N];
int init()
{
    int len=strlen(s);
    news[0]='$',news[1]='#';
    int j=2;
    for(int i=0;i<len;i++)news[j++]=s[i],news[j++]='#';
    news[j]='\0';
    return j;
}
int manacher()   //建议就着上面的图看
{
    int len=init();
    int ans=-N,id,mx=0;
    for(int i=1;i<len;i++)
    {
        if(i<mx)p[i]=min(p[id*2-i],mx-i);
        else p[i]=1;
        while(news[i-p[i]]==news[i+p[i]])p[i]++;
        if(mx<i+p[i])id=i,mx=i+p[i];
        ans=max(ans,p[i]-1);
    }
    return ans;
}
int main()
{
    scanf("%s",s);
    printf("%d",manacher());
    return 0;
}

模板题

洛谷 p3805

P3805 【模板】manacher算法

题目描述

给出一个只由小写英文字符a,b,c…y,z组成的字符串S,求S中最长回文串的长度.

字符串长度为n

输入格式

一行小写英文字符a,b,c…y,z组成的字符串S

输出格式

一个整数表示答案

输入输出样例

输入 #1

aaa

输出 #1

3

输出格式

一个整数表示答案

输入输出样例

输入 #1

aaa

输出 #1

3

代码直接用上面的就可以了

如果有那个过程不明白,欢迎评论,我会实时更新图解

内容概要:本文介绍了一种基于蒙特卡洛模拟和拉格朗日优化方法的电动汽车充电站有序充电调度策略,重点针对分时电价机制下的分散式优化问题。通过Matlab代码实现,构建了考虑用户充电需求、电网负荷平衡及电价波动的数学模【电动汽车充电站有序充电调度的分散式优化】基于蒙特卡诺和拉格朗日的电动汽车优化调度(分时电价调度)(Matlab代码实现)型,采用拉格朗日乘子法处理约束条件,结合蒙特卡洛方法模拟大量电动汽车的随机充电行为,实现对充电功率和时间的优化分配,旨在降低用户充电成本、平抑电网峰谷差并提升充电站运营效率。该方法体现了智能优化算法在电力系统调度中的实际应用价值。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及从事新能源汽车、智能电网相关领域的工程技术人员。; 使用场景及目标:①研究电动汽车有序充电调度策略的设计与仿真;②学习蒙特卡洛模拟与拉格朗日优化在能源系统中的联合应用;③掌握基于分时电价的需求响应优化建模方法;④为微电网、充电站运营管理提供技术支持和决策参考。; 阅读建议:建议读者结合Matlab代码深入理解算法实现细节,重点关注目标函数构建、约束条件处理及优化求解过程,可尝试调整参数设置以观察不同场景下的调度效果,进一步拓展至多目标优化或多类型负荷协调调度的研究。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值