【基础算法】【双指针】

104 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

链接:
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;
}