解题思路:观察题目可以发现,我们发现第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分
3 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复