AcWing 3175. 人物相关性分析
原题链接
中等
作者:
RP
,
2021-03-25 20:19:10
,
所有人可见
,
阅读 663
C++ 代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1000010;
int Alice[N];
int Bob[N];
int main(){
int k;
cin>>k;
getchar();//作用是读取上一行的回车
string s;
getline(cin,s);
//遍历文本,统计文段中Alice的下标
int cur = 0,a=0;
int n = s.size();
while(cur < n){
int pos = s.find("Alice",cur);
if(pos==-1){//找到末尾了
break;
}
//Alice 和 Bob 应为单独的单词,前后可以有标点符号和空格,但是不能有字母。例如 Bobbi 並不算出现了 Bob
if((pos-1<0||!isalpha(s[pos-1]))&&(pos+5>=n||!isalpha(s[pos+5]))){
Alice[a]=pos;
a++;
}
cur = pos + 5;
}
//遍历文本,统计文段中Bob的下标
int b=0;
cur = 0;
while(cur < n){
int pos = s.find("Bob",cur);
if(pos==-1){//找到末尾了
break;
}
//Alice 和 Bob 应为单独的单词,前后可以有标点符号和空格,但是不能有字母。例如 Bobbi 並不算出现了 Bob
if((pos-1<0||!isalpha(s[pos-1]))&&(pos+3>=n||!isalpha(s[pos+3]))){
Bob[b]=pos;
b++;
}
cur = pos + 3;
}
//利用双指针判断
LL ans=0;
for(int i=0,l=0,r=0;i<a;i++){//i表示第几个Alice
//在不越界Bob数组的前提下,找左边界
while(l<b&&Bob[l]<Alice[i]-k-3){
l++;
}
//在不越界Bob数组的前提下,找右边界
while(r<b&&Bob[r]<=Alice[i]+k+5){
r++;
}
ans+=r-l;
}
cout<<ans;
return 0;
}