标签:双指针
思路
由于要求的子串不含"P",所以"P"将整个字符串分成了好几段子串,所求的方案数应当是每个子串的方案数的总和
本题可以枚举右端点,当遇到"R"时,让cnt++,当遇到"P"时,将cnt清零,并且记录该位置last,当cnt>=k时,我们从记录的位置开始找第一个不满足条件的位置now,方案数即为now-last(因为这个区间肯定是满足条件的),例如k=3,PBBRRRP,方案数为3,也就是第一个R的位置减去第一个P的位置
代码实现
#include<stdio.h>
#include<iostream>
using namespace std;
int n, k;
string s;
int main(){
cin >> n >> k;
cin >> s;
s = " " + s;
int cnt = 0, last = 0, now = 0;
long long ans = 0;
for(int i = 1; i <= n; i++){
if(s[i] == 'R') cnt++;
else if(s[i] == 'P'){
cnt = 0;
last = i;
now = i;
}
while(cnt > k){
if(s[now] == 'R') cnt--;
now++;
}
while(cnt == k){
if(s[now] == 'R') break;
now++;
}
ans+=now-last;
}
cout << ans;
return 0;
}