题目描述
又是一个风和日丽的下午,小非再一次看到了那个熟悉的地摊。这一次地摊摊主举办了一个活动,如果收集到
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;
}
代码提交结果