串匹配
作者:互联网
链接:https://ac.nowcoder.com/acm/contest/23479/A
来源:牛客网
小红很喜欢红色(用'R'字母表示),但她非常讨厌紫色(用'P'字母表示)。
她想取一个连续子串,该子串包含至少 k 个'R'字符,且不能包含'P'字符。
你能告诉她有多少合法的方案可以取到吗?
注:只要连续子串的起始位置或终止位置不同,我们就认为是两个不同的方案。
识别到p就切割 问题转换成 统计满足k个p的字串有多少个
记录一个temp的数组
因为是子串 所以右端到左端满足k个的时候,就将
左端点向右走几次 就说明这个子串(右端点固定,左端点长度,长度减少的字串的数量)有几个
如 **rrr 区间不断减少
rrr
rrr
满足条件的字串有两个 为j走过的(减少的)数量
res+=j;
#include<bits/stdc++.h>
using namespace std;
int n,k;
string s;
long long res=0;
void gao(string t){ //求字符串t中有多少子串包含至少k个'R'
int i,j=0,temp=0;
for(i=0;i<t.length();i++){//枚举右端点,找第一个不合法的左端点
temp+=t[i]=='R';
while(j<=i&&temp==k){
temp-=t[j++]=='R';
}
//在这个左端点前面的都是合法的。
res+=j;
}
}
int main(){
int i;
cin>>n>>k>>s;
string t="";
for(i=0;i<n;i++){
if(s[i]=='P')gao(t),t="";
else t+=s[i];
}
gao(t);
cout<<res;
}
标签:子串,匹配,string,res,字串,端点,rrr 来源: https://www.cnblogs.com/liang302/p/15877352.html