#3314. constructive

本文介绍了一种使用动态规划和哈希技巧优化字符串构造过程的方法,旨在解决如何在给定条件下,以最少的时间代价构造出特定长度的字符串。通过定义状态转移方程,结合哈希判断字符串相等性,实现O(n)的高效算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

JohnCheng最近沉迷几何,导致走火入魔,于是打算搞下string来缓解压力。他有一张草稿纸,最开始什么都没有(可以视为有一个空串)。每一步他可以花费 aaa 时间在当前字符串后面加入任意一个字符,也可以花费 b×∣S∣b \times |S|b×S (S为当前字符串)的时间把S抄一遍放在S前面。

旁边的Worldwide_D正苦于一道字符串毒瘤题,他获得了一个数据点,数据点里有一个长度不大于 10610^6106 的字符串。他把字符串发给JohnCheng,问他至少能在多长时间内构造出这个字符串。

JohnCheng:水题一道。然后开始睡觉,并把问题交给了你。

数据范围

∣S∣≤106,1≤b&lt;a≤105∣S∣≤10 ^6 ,1≤b&lt;a≤10 ^5S106,1b<a105

题解

考虑 dpdpdpfif_ifi 表示构造好了前 iii 个字符的最小代价,则首先 fi=fi−1+af_i=f_{i-1}+afi=fi1+a

然后如果 iii 是偶数并且 [1.i2][1.\frac{i}{2}][1.2i][i2+1,i][\frac{i}{2}+1,i][2i+1,i] 的字符串相同的话,则有 fi=min(fi,fi2+b×i2)f_i=min(f_i,f_{\frac{i}{2}}+b \times \frac{i}{2})fi=min(fi,f2i+b×2i) ,判断相同就用哈希判断

效率: O(∣S∣)O(|S|)O(S)

代码

#include <bits/stdc++.h>
#define LL long long
#define U unsigned LL
using namespace std;
const int N=1e6+5;
const U K=793999;
int a,b,n;char s[N];
LL f[N];U h[N],k[N];
U H(int l,int r){
	return h[r]-h[l-1]*k[r-l+1];
}
int main(){
	scanf("%s%d%d",s+1,&a,&b);
	n=strlen(s+1);k[0]=1;
	for (int i=1;i<=n;i++)
		k[i]=k[i-1]*K,h[i]=h[i-1]*K+s[i];
	for (int i=1;i<=n;i++){
		f[i]=f[i-1]+a;
		if (!(i&1) && H(1,i>>1)==H((i>>1)+1,i))
			f[i]=min(f[i>>1]+1ll*b*(i>>1),f[i]);
	}
	return printf("%lld\n",f[n]),0;
}
资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在当今的软件开发领域,自动化构建与发布是提升开发效率和项目质量的关键环节。Jenkins Pipeline作为一种强大的自动化工具,能够有效助力Java项目的快速构建、测试及部署。本文将详细介绍如何利用Jenkins Pipeline实现Java项目的自动化构建与发布。 Jenkins Pipeline简介 Jenkins Pipeline是运行在Jenkins上的一套工作流框架,它将原本分散在单个或多个节点上独立运行的任务串联起来,实现复杂流程的编排与可视化。它是Jenkins 2.X的核心特性之一,推动了Jenkins从持续集成(CI)向持续交付(CD)及DevOps的转变。 创建Pipeline项目 要使用Jenkins Pipeline自动化构建发布Java项目,首先需要创建Pipeline项目。具体步骤如下: 登录Jenkins,点击“新建项”,选择“Pipeline”。 输入项目名称和描述,点击“确定”。 在Pipeline脚本中定义项目字典、发版脚本和预发布脚本。 编写Pipeline脚本 Pipeline脚本是Jenkins Pipeline的核心,用于定义自动化构建和发布的流程。以下是一个简单的Pipeline脚本示例: 在上述脚本中,定义了四个阶段:Checkout、Build、Push package和Deploy/Rollback。每个阶段都可以根据实际需求进行配置和调整。 通过Jenkins Pipeline自动化构建发布Java项目,可以显著提升开发效率和项目质量。借助Pipeline,我们能够轻松实现自动化构建、测试和部署,从而提高项目的整体质量和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值