题目链接
这题双指针没想出来,用二分+前缀和写出来了,写的巨复杂,下面是两种写法
二分+前缀和写法
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <map>
using namespace std;
#define int long long
const int N = 200010;
char s[N];
int n,k;
int R[N],cnt[N];
signed main()
{
cin>>n>>k;
scanf("%s",s+1);
int res=0;
R[n+1]=n;
for(int i=n;i>=1;i--)
{
if(s[i]=='P')R[i]=i-1;
else R[i]=R[i+1];
}
for(int i=1;i<=n;i++)
{
if(s[i]=='R')cnt[i]=cnt[i-1]+1;
else cnt[i]=cnt[i-1];
}
for(int i=1;i<=n;i++)
{
int l=i,r=R[i];
if(cnt[r]-cnt[l-1]<k)continue;
while(l<r)
{
int mid=l+r>>1;
if(cnt[mid]-cnt[i-1]>=k)r=mid;
else l=mid+1;
}
res+=R[i]-r+1;
}
cout<<res<<endl;
}
双指针写法
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
#define int long long
const int N = 200010;
char s[N];
int n,k;
signed main()
{
cin>>n>>k;
scanf("%s",s);
int res=0;
for(int i=0,l=-1,r=0,cnt=0;i<n;i++)
{
while(l<n&&cnt<k)cnt+=(s[++l]=='R');
if(r<i)r=i;
while(s[r]!='P'&&r<n)r++;
cnt-=(s[i]=='R');
res+=max(0ll,r-l);
}
cout<<res<<'\n';
}