#蓝桥杯 人物相关性分析


思路:
统计两者开头字母出现的位置 保存在数组里
如果分别枚举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;
}




posted @ 2021-03-11 17:08  一个经常掉线的人  阅读(145)  评论(0)    收藏  举报