#蓝桥杯 人物相关性分析

思路:
统计两者开头字母出现的位置 保存在数组里
如果分别枚举AB会导致超时,由于保存的数据有顺序性。可以只通过枚举A维护一个滑动窗口来获得答案
#include <iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
using namespace std;
int k;
string s;
vector<int>Alice,Bob;//???????
int main(){
Bob.push_back(-10000000);
cin >> k;
getchar();
getline(cin,s);
int len=s.length();
for(int i=0;i<len;i++){
if(s[i]=='A')
{
if(i+4<len && s[i+1]=='l' && s[i+2]=='i'&& s[i+3]=='c'&& s[i+4]=='e')
{
Alice.push_back(i);
}
}
else if(s[i]=='B'){
if(i+2<len && s[i+1]=='o' && s[i+2]=='b'){
Bob.push_back(i);
}
}
}
Bob.push_back(10000000);//设置不可能的起点和终点 避免边界问题
int A=Alice.size();
int B=Bob.size();
long long ans=0;
int lp=0,rp=0;
for(int i=0;i<A;i++){
while(Bob[lp]<Alice[i]-3-k){
lp++;
}
while(Bob[rp+1]<=Alice[i]+5+k) {
rp++;
}
if(rp-lp+1>0) ans+=rp-lp+1;
}
cout<<ans;
return 0;
}

浙公网安备 33010602011771号