黑心商家(2)

该代码实现了一个算法,用于解决在给定的字符串(手办序列)中,找到最少需要购买多少个连续的手办,以便能收集到k个相同类型手办的问题。程序使用滑动窗口的方法遍历字符,并更新结果。

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

题目描述

又是一个风和日丽的下午,小非再一次看到了那个熟悉的地摊。这一次地摊摊主举办了一个活动,如果收集到

k个同种手办,就可以兑换超级手办。

小非想要这个超级手办,但是囊中羞涩,无法把地摊上所有的手办都买下来。请你帮小非看看,他最少买几个手办,就能搜集到k个同种类型的。

需要注意的是摊主仍旧要求只能买连续的几个手办。(每种手办都用小写字母表示,不同手办对应字母不同)

输入格式

输入第一行包括两个正整数n,k(1≤k≤n≤200000)。

第二行有一个长度为n的字符串,表示摊主摆放的所有手办。

输出格式

如果无论怎么取都无法满足条件,则输出−1。

否则输出一个正整数,表示小非需要买的最少手办数量。

输入输出样例

输入 #1

5 2
abeba

输出 #1

3

说明/提示

数据规模与约定

输入样例1解释:购买beb就可以获取两个b。​​​​​​​

AC代码

#include<bits/stdc++.h>
using namespace std;
int n,m,l,r;
int res=200200;
string s;
int p[30][200200];
int main(){
	ios::sync_with_stdio(false);
	cin>>n>>m>>s;
	s=" "+s;
	for(int i=0;i<=25;i++){
		for(int j=1;j<=n;j++){
			p[i][j]=p[i][j-1];
			if(s[j]==char('a'+i)){
				p[i][j]++;
			}
		}
	}
	for(int i=0;i<=25;i++){
		l=1;
		r=1;
		while(l<=n and r<=n and l<=r){
			while(r<=n and p[i][r]-p[i][l-1]<m){
				r++;
			}
			while(l<=n and l<=r and p[i][r]-p[i][l-1]>m){
				l++;
			}
			if(p[i][r]-p[i][l-1]==m){
				res=min(res,r-l+1);
			}
			l++;
		}
	}
	if(res==200200){
		cout<<"-1";
	}else{
		cout<<res;
	}
	return 0;
}

代码提交结果 ​​​​​​​ 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值