蓝桥杯:人物相关性分析
题解:
最容易想到的便是枚举遍历,但由于数量巨大必定会超时。
因此我们可考虑使用双指针来模拟滑动窗口解决该题。
首先我们创建两个数组用双指针查找分别存储出现的Alice和Bob的头部下标,接着我们再遍历两个数组,任选出现的Alice和Bob的下标进行逻辑上的比较,符合题目范围则sum加一,否则不加即可。
(这里我写的是这里我写的是Alice左边和右边为空格的情况,该题为左右不能为字母即可 ,所以将左右两个字符的范围根据ascii码限制一下即可)
代码:
#include <bits/stdc++.h>
using namespace std;
char str[1000001];
int a1[1000000];
int a2[1000000];
int main()
{
int i,j,k,t;
i = 0;
j = 0;
k = 0;
cin>>t;
while(getchar()!='\n');//需要吸收缓冲区字符
gets(str);//其会录入空格
int n = strlen(str);
while(i<n)
{
if(i+6<n)//保证不越界,且不满足时查找也没有意义了
{
if(str[i]==' '&&str[i+1]=='A'&&str[i+2]=='l'&&str[i+3]=='i'&&str[i+4]=='c'&&str[i+5]=='e'&&str[i+6]==' ')//这里我写的是Alice左边和右边为空格的情况,该题为左右不能为字母即可
{ //所以将左右两个字符的范围根据ascii码限制一下即可
a1[j++] = i+1;
}
}
if(i+4<n)//同
{
if(str[i]==' '&&str[i+1]=='B'&&str[i+2]=='o'&&str[i+3]=='b'&&str[i+4]==' ')//同
{
a2[k++] = i+1;
}
}
i++;
}
int sum = 0;//记录个数总和
for(int m=0;m<j;m++)//再遍历一次存储alice和bob的数组看是否有符合的
{
for(int q=0;q<k;q++)
{
if(a2[q]-a1[m]-5<=t&&a2[q]-a1[m]-5>0)//一前一后,两种情况
{
sum++;
}
if(a1[m]-a2[q]-3<=t&&a1[m]-a2[q]-3>0)
{
sum++;
}
}
}
cout<<sum;
return 0;
}