基础算法双指针

Posted 行码棋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基础算法双指针相关的知识,希望对你有一定的参考价值。

链接:
https://ac.nowcoder.com/acm/contest/23479/A

一个字符串求至少含有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;

以上是关于基础算法双指针的主要内容,如果未能解决你的问题,请参考以下文章

算法基础之数组的增删改查和双指针思想的妙用

基础算法一:同向双指针

双指针算法:同向双指针模板以及相关面试题

算法基础——双指针:快速排序(重点)

算法基础之数组的增删改查和双指针思想的妙用

算法基础之数组的增删改查和双指针思想的妙用