[USACO23OPEN] Pareidolia G

文章介绍了一个字符串处理的问题,目标是在给定代价条件下删除字符使子串bessie出现次数最多。通过遍历字符串,使用动态规划方法计算不同位置和状态下的最小代价,同时考虑出现次数的最大化。最终,文章提供了实现代码并讨论了时间复杂度。

洛谷[USACO23OPEN] Pareidolia G

题目大意

有一个字符串 s s s,你可以删除若干个字符,删除第 i i i个字符的代价是 c i c_i ci。求删除若干个字符后的字符串中最多能出现多少个 bessie \text{bessie} bessie,并求在 bessie \text{bessie} bessie出现次数最多的前提下最小的删除代价和。

1 ≤ ∣ S ∣ ≤ 2 × 1 0 5 , 1 ≤ c i ≤ 1000 1\leq |S|\leq 2\times 10^5,1\leq c_i\leq 1000 1S2×105,1ci1000


题解

首先,我们可以遍历一遍字符串 S S S来求出最多的出现次数,设这个次数为 a n s 1 ans1 ans1

f i , j f_{i,j} fi,j表示 S S S枚举到前 i i i位,当前最后一个字符串 bessie \text{bessie} bessie比配到第 j j j位时的最小代价。

对于每一个 i i i,用 f i − 1 , j + a i f_{i-1,j}+a_i fi1,j+ai来更新 f i , j f_{i,j} fi,j,并根据当前的 s i s_i si来进行转移。还要注意当 bessie \text{bessie} bessie中结尾的 e e e转移到新的 bessie \text{bessie} bessie的开头的 b b b时不需要删除中间的字符,所以可以用 l s t lst lst来记录前 i − 1 i-1 i1个位置中最小的 f k , 6 f_{k,6} fk,6,并用 l s t lst lst来更新 f i , 1 f_{i,1} fi,1

但是,在一些时候,我们应该选择的是出现次数最多的 f f f值来更新而不是代价最少的。那么,每当转移到一个新的 bessie \text{bessie} bessie的时候,令 f i , 6 = min ⁡ ( f i , 6 , l s t − 1 0 9 ) f_{i,6}=\min(f_{i,6},lst-10^9) fi,6=min(fi,6,lst109),这样每多出现一次, f f f值中就多减一个 1 0 9 10^9 109。因为代价无论如何都不会达到 1 0 9 10^9 109,所以这样能保证能够取得出现次数最多且在此前提下代价最小的转移。

注意一开始的 l s t = 1 0 9 lst=10^9 lst=109,最小的删除代价和为 a n s 2 = min ⁡ { f i , 6 + ( a n s 1 − 1 ) × 1 0 9 } ans2=\min\{f_{i,6}+(ans1-1)\times 10^9\} ans2=min{fi,6+(ans11)×109}

时间复杂度为 O ( n ) O(n) O(n)

code

#include<bits/stdc++.h>
using namespace std;
int s1,t1,a[200005];
long long inf=1e9,ans1=0,ans2=1e18,lst,f[200005][15];
char s[200005],t[15];
int main()
{
	scanf("%s",s+1);
	s1=strlen(s+1);
	t[1]='b';t[2]='e';t[3]=t[4]='s';t[5]='i';t[6]='e';
	t1=6;
	for(int i=1;i<=s1;i++){
		scanf("%d",&a[i]);
	}
	for(int i=1,now=1;i<=s1;i++){
		if(s[i]==t[now]){
			if(now<t1) ++now;
			else{
				now=1;++ans1;
			}
		}
	}
	for(int k=1;k<=6;k++) f[0][k]=inf;
	lst=inf;
	for(int i=1;i<=s1;i++){
		for(int k=1;k<=6;k++) f[i][k]=f[i-1][k]+a[i];
		if(s[i]=='b'){
			f[i][1]=min(f[i][1],lst-inf);
		}
		else if(s[i]=='e'){
			f[i][2]=min(f[i][2],f[i-1][1]);
			f[i][6]=min(f[i][6],f[i-1][5]);
		}
		else if(s[i]=='s'){
			f[i][3]=min(f[i][3],f[i-1][2]);
			f[i][4]=min(f[i][4],f[i-1][3]);
		}
		else if(s[i]=='i'){
			f[i][5]=min(f[i][5],f[i-1][4]);
		}
		lst=min(lst,f[i][6]);
		ans2=min(ans2,f[i][6]+(ans1-1)*inf);
	}
	printf("%lld\n%lld",ans1,ans2);
	return 0;
}
内容概要:本文详细介绍了一个基于C++的养老院管理系统的设计与实现,旨在应对人口老龄化带来的管理挑战。系统通过整合住户档案、健康监测、护理计划、任务调度等核心功能,构建了从数据采集、清洗、AI风险预测到服务调度与可视化的完整技术架构。采用C++高性能服务端结合消息队列、规则引擎和机器学习模型,实现了健康状态实时监控、智能任务分配、异常告警推送等功能,并解决了多源数据整合、权限安全、老旧硬件兼容等实际问题。系统支持模块化扩展与流程自定义,提升了养老服务效率、医护协同水平和住户安全保障,同时为运营决策提供数据支持。文中还提供了关键模块的代码示例,如健康指数算法、任务调度器和日志记录组件。; 适合人群:具备C++编程基础,从事软件开发或系统设计工作1-3年的研发人员,尤其是关注智慧养老、医疗信息系统开发的技术人员。; 使用场景及目标:①学习如何在真实项目中应用C++构建高性能、可扩展的管理系统;②掌握多源数据整合、实时健康监控、任务调度与权限控制等复杂业务的技术实现方案;③了解AI模型在养老场景中的落地方式及系统架构设计思路。; 阅读建议:此资源不仅包含系统架构与模型描述,还附有核心代码片段,建议结合整体设计逻辑深入理解各模块之间的协同机制,并可通过重构或扩展代码来加深对系统工程实践的掌握。
内容概要:本文详细介绍了一个基于C++的城市交通流量数据可视化分析系统的设计与实现。系统涵盖数据采集与预处理、存储与管理、分析建模、可视化展示、系统集成扩展以及数据安全与隐私保护六大核心模块。通过多源异构数据融合、高效存储检索、实时处理分析、高交互性可视化界面及模块化架构设计,实现了对城市交通流量的实时监控、历史趋势分析与智能决策支持。文中还提供了关键模块的C++代码示例,如数据采集、清洗、CSV读写、流量统计、异常检测及基于SFML的柱状图绘制,增强了系统的可实现性与实用性。; 适合人群:具备C++编程基础,熟悉数据结构与算法,有一定项目开发经验的高校学生、研究人员及从事智能交通系统开发的工程师;适合对大数据处理、可视化技术和智慧城市应用感兴趣的技术人员。; 使用场景及目标:①应用于城市交通管理部门,实现交通流量实时监测与拥堵预警;②为市民出行提供路径优化建议;③支持交通政策制定与信号灯配时优化;④作为智慧城市建设中的智能交通子系统,实现与其他城市系统的数据协同。; 阅读建议:建议结合文中代码示例搭建开发环境进行实践,重点关注多线程数据采集、异常检测算法与可视化实现细节;可进一步扩展机器学习模型用于流量预测,并集成真实交通数据源进行系统验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值