HDOJ - 3068 最长回文 Manacher

    早就听说过这个方法..当时不理解就过了...今天再来写这题..带来的感觉很深刻...

    充分利用前面判断过的内容...尽可能减少重复判断是Manacher的核心....

     预处理..但凡回文串的问题..在这个串的最头和最末以及每个字符中间加入相同的冗余字符..这样就可以把奇偶情况一起讨论了..记住最后结果除以2...

    dp [ i ]  代表以 s [ i ] 为中心的回文串最长长度...dp值从字符串最左更新到最右...每次除了更新dp [ i ] 还要维护两个值...w , i ( 前面一段某点为中心的回文所能到的最右的位置 w, 以及这个中间点是哪个 p )....

    充分利用回文串的特点..左右对称相等.. 看下面两种情况:

  1>

        当前扫到了i...之前p能到最右距离w...那么可以将i对称p找到左侧的对应点...并且这个点的回文长度在p最长回为之内..那么dp[i]=dp[2*p-i]...直接赋值....

   2>


        当前点i对称于p的点是i'...而i'的最长回文范围已经超过p的范围...所以只能得出..以i为中点..w为右界的回文串是ok的...但要从w+1继续往后面判断..以i为中心找到不能回文为止..此时将p改为i...w改为i的最右位置....

       

        关于效率的问题...由于w是单调往右移动的...所以时间效率是O(n)....

     


Program:

#include<iostream>
#include<string>
#include<cmath>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#define ll long long 
#define oo 1000000000
using namespace std;  
char str[250005],s[250005];
int dp[250005];
int main()
{
       int l,i,j,w,p,k,ans; 
       while (~scanf("%s",&str))
       {
             l=strlen(str); 
             memset(dp,0,sizeof(dp));
             s[0]='*';
             for (i=0;i<l;i++) s[i*2+1]=str[i],s[i*2+2]='*';
             l*=2; 
             memset(dp,0,sizeof(dp));
             dp[0]=ans=1;  w=p=0;  
             for (i=1;i<=l;i++)
             { 
                  if (i<=w) dp[i]=dp[2*p-i];
                  if (i+dp[i]/2>=w)
                  {
                         p=i;
                         if (w>=i) dp[i]=(w-i)*2;
                            else w=i;
                         dp[i]++;
                         while (w+1<=l && s[w+1]==s[2*p-w-1]) dp[i]+=2,w++;  
                  }
                  if (ans<dp[i]) ans=dp[i];
             }
             printf("%d\n",ans/2);
       }
       return 0;
}


内容概要:本文围绕“风光制氢合成氨系统优化研究”展开,基于Matlab代码实现对风能、光伏等可再生能源耦合制氢及进一步合成氨的综合能源系统进行建模与优化分析。研究涵盖系统容量配置与运行调度的协同优化,考虑风光出力不确定性、电解槽制氢效率、合成氨能耗特性等因素,构建数学模型并采用优化工具(如YALMIP+CPLEX)求解,旨在降低系统综合成本、提升可再生能源消纳能力。文中提供完整的代码实现路径,支持论文复现,帮助理解系统架构、能量流管理及优化算法应用。; 适合人群:具备一定电力系统、能源系统背景,熟悉Matlab编程,从事可【论文复现】风光制氢合成氨系统优化研究(Matlab代码实现)再生能源、综合能源系统、氢能利用等相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①复现高水平论文中的风光制氢合成氨系统优化模型;②掌握YALMIP建模语言在能源系统优化中的应用;③开展类似多能互补系统(如风电/光伏/电解槽/储氢/合成氨)的建模与仿真研究;④支撑科研项目、论文写作或课程设计中的案例开发与算法验证。; 阅读建议:建议结合文中提到的网盘资源下载完整代码与数据,按照目录顺序逐步学习,重点关注系统建模思路、约束条件设定与目标函数构建,并动手调试运行代码以加深理解;同时可对比Python版本实现,拓展编程与应用场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值