蓝桥杯:人物相关性分析(双指针+双数组存储)

蓝桥杯:人物相关性分析

在这里插入图片描述

题解:

最容易想到的便是枚举遍历,但由于数量巨大必定会超时。

因此我们可考虑使用双指针来模拟滑动窗口解决该题。

首先我们创建两个数组用双指针查找分别存储出现的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;
}

猜你喜欢

转载自blog.csdn.net/xiangguang_fight/article/details/115283967
今日推荐