解题思路:观察题目可以发现,我们发现第i个是c2可以组成的子串数量[0,i-k]这个区间内c1的数量,所有我们只需要找到每个c2(假设下标为i)[0,i-k]这个区间内c1的数量就可以得到答案。但是观察数据规模发现使用暴力的方法不能AC该题。

优化:

使用前缀和思想,另开一个数组,保存当前c1前(包括自身)有多少个c1,这样只需要找到i-k(假设下标为i)后最近的c1就好了

参考代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
	long long x[500005];
        char s[500005];
	int n;
	scanf("%d",&n);
	char c1,c2;
	scanf("%s",s);
	scanf(" %c",&c1);
	scanf(" %c",&c2);
	long long a=0;
	for(int i=0;s[i]!='\0';i++)
	{
		if(s[i]==c1)
		{
			a++;
			x[i]=a;
		}
	}
	long long ans=0;
	for(int i=0;s[i]!='\0';i++)
	{
		if(s[i]==c2)
		{
			for(int j=i-n+1;j>=0;j--)
			{
				if(s[j]==c1)
				{
					ans+=x[j];
					break;
				}
			}
		}
	}
	printf("%lld",ans);
	return 0;
}

该题数据不够完美若数据为

1

abbb...省略5 × 105-5个b...b a b

复杂度还是来到了o(n2)

此代码还可以再优化

可以再开一个数组保存距离最近的c1的下标

时间复杂度为o(n)

点赞(0)
 

0.0分

3 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 2 条评论

酱酱 1年前 回复TA
@aha 连号符?是指空格吗?空格的话注意我的输入scanf(" %c",&c1);中%c前有一个空格哦,我设置了输入的格式,所以把空格去掉了
aha 1年前 回复TA
他这个连号符不算这个条件体现在那里呢