思路:
将连续按键相同的区间记录下来,然后挨个进行遍历,如果大于的最大按键数的话,则通过nth_element来进行处理后再减轻即可。
代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn=2e5+5;
typedef long long ll;
int n,k;
int score[maxn];
char a[maxn];
struct loc
{
int l,r;
};
loc b[maxn];
int main()
{
ll sum=0;
scanf("%d%d",&n,&k);
for (int i=0;i<n;i++)
{
scanf("%d",&score[i]);
sum+=score[i];
}
scanf("%s",a);
int cnt=0;
b[cnt].l=0,b[cnt].r=0;
for (int i=1;i<n;i++)
{
while (a[i]==a[i-1]&&i<n)
{
i++;
}
b[cnt++].r=i-1;
if(i<n) b[cnt].l=i,b[cnt].r=i;
}
if(a[n-1]!=a[n-2]) cnt++;
for (int i=0;i<cnt;i++)
{
int num=b[i].r-b[i].l+1;
if(num>k)
{
nth_element(score+b[i].l,score+b[i].l+num-k,score+b[i].l+num);
for (int j=0;j<num-k;j++)
{
sum-=score[b[i].l+j];
}
}
}
printf("%lld\n",sum);
return 0;
}