本文已参与「新人创作礼」活动,一起开启掘金创作之路。
链接:
ac.nowcoder.com/acm/contest…
一个字符串求至少含有k个R且不含P的子串个数
因为不含P,所以可以以P为界限,将字符串分成诸多小的字符串,对每一个小的字符串统计满足题意得子串个数
统计子串个数:
固定右端点i,对于左端点j,让j移动到恰好不满足子串个数等于k的情况(第一个不合法的左端点),统计左边可以延伸的种类数。
善意提醒:统计个数之类的题目不开long long见祖宗
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+5;
typedef long long ll;
int main()
{
int n,k;
cin>>n>>k;
string s;
cin>>s;
function<ll(string)> count = [&](string a) -> ll
{
ll cnt = 0;
int t = 0;
for(int i=0,j=0;i<a.size();i++)
{
t += (a[i]=='R');
while(j <= i and t >= k) t -= (a[j++]=='R');//找到第一个不合法的左端点
cnt += j;
}
return cnt;
};
string t = "";
ll res = 0;
for(int i=0;i<s.size();i++)
{
if(s[i]=='P') res += count(t),t = "";
else t += s[i];
}
res += count(t);
cout<<res<<endl;
return 0;
}