思路
拆分字符串,将字符串分成字母和字符类型,然后前缀和维护两个点的距离。
创建两个队列放alice和bob,分别枚举ab和ba的情况
C++ 代码
#include<stdio.h>
#include<vector>
#include<string>
#include<iostream>
#include<queue>
using namespace std;
vector<string> ss;
int k;
queue<int> a;
queue<int> b;
bool check(char x)
{
if(x>=65&&x<=90) return true;
if(x>=97&&x<=122) return true;
return false;
}
int main()
{
cin>>k;
getchar();
string s;
getline(cin,s);
for(int i=1,j=0;i<s.size();i++)
{
if(check(s[i])!=check(s[i-1])){
string temp=s.substr(j,i-j);
ss.push_back(temp);
j=i;
}
if(i==s.size()-1){
string temp=s.substr(j,i-j+1);
ss.push_back(temp);
j=i;
}
}
long long ans=0;
vector<int> pre_s(ss.size()+1,0);
for(int i=1;i<ss.size();i++) pre_s[i]=pre_s[i-1]+ss[i-1].size();
for(int i=0;i<ss.size();i++)
{
if(ss[i]=="Alice")
{
a.push(i+1);
while(!b.empty()&&pre_s[i]-pre_s[b.front()]>k) b.pop();
ans+=b.size();
}
if(ss[i]=="Bob")
{
b.push(i+1);
while(!a.empty()&&pre_s[i]-pre_s[a.front()]>k) a.pop();
ans+=a.size();
}
}
cout<<ans;
return 0;
}
]