瞌睡小源


私信TA

用户名:H2130823055

访问量:5083

签 名:

我が名はめぐみん、爆裂魔法を操りし者

等  级
排  名 45
经  验 11554
参赛次数 5
文章发表 76
年  龄 0
在职情况 学生
学  校 贺州学院
专  业

  自我简介:

解题思路:观察题目可以发现,我们发现第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分

4 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换

万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区

他这个连号符不算这个条件体现在那里呢
2023-08-26 13:22:56
  • «
  • 1
  • »