RGB Substring (hard version) CodeForces - 1196D2

题目传送门

分析:

此题用到了前缀和,能够降低时间复杂度,代码比较容易理解

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<cstring>
using namespace std;
const int maxn=2e5+100;
int main()
{
	int n;
	char p[3]={'G','B','R'};
	
	scanf("%d",&n);
	while(n--)
	{
		int l,k;
		char s[maxn];
		int ans=maxn;
		int ant[3][maxn];
		ant[0][0]=0;ant[1][0]=0;ant[2][0]=0;
		scanf("%d%d",&l,&k);
		scanf("%s",s+1);
		for(int i=1;i<=l;i++)
		{
			if(s[i]==p[(i+3)%3])
				ant[0][i]=ant[0][i-1];
			else
				ant[0][i]=ant[0][i-1]+1;
			if(s[i]==p[(i+3+1)%3])
				ant[1][i]=ant[1][i-1];
			else
				ant[1][i]=ant[1][i-1]+1;
			if(s[i]==p[(i+3+2)%3])
				ant[2][i]=ant[2][i-1];
			else
				ant[2][i]=ant[2][i-1]+1;
		}
	//	printf("ans %d\n",ans);
		for(int i=0;i<=l-k;i++)
		{
			ans=min(ans,ant[0][i+k]-ant[0][i]);
			ans=min(ans,ant[1][i+k]-ant[1][i]);
			ans=min(ans,ant[2][i+k]-ant[2][i]);
		}
		printf("%d",ans);
		if(n)
			printf("\n");
	}
	return 0;
}

在做这道题时,我在while中定义ant数组,然后memset初始化为0,结果超时了,后面改成了

	ant[0][0]=0;ant[1][0]=0;ant[2][0]=0;

就通过了,memset初始化还是有一些耗时的。写代码时,时间复杂度能优化就优化 。

发布了40 篇原创文章 · 获赞 2 · 访问量 861

猜你喜欢

转载自blog.csdn.net/qq_43851311/article/details/103151856
今日推荐