基础算法双指针
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;
以上是关于基础算法双指针的主要内容,如果未能解决你的问题,请参考以下文章