寒假训练1.17训练赛C

题目大意
有一个长度为n(1<=n<=2*10^5)且仅包含着"R",“B”,"G"三种字母的字符串s。
你可以将任意一个字母修改成另外两个字母。
对于任意i,j,如果s[i]=s[j],那么要求| i-j | mod 3=0。
求最小的修改次数。
解题思路
前三个字母确定了,那么后面的字母也就确定了。
因此只要确定开头三个字母的顺序(共六种),每种顺序算一遍去最小值即可。
代码

#include <cstdio>
#include <iostream>
#include <string>
using namespace std;
int main()
{
	int len;
	string st;
	cin>>len;
	cin>>st;
	int ans=999999999;
	int w=0;
	string s[]={"GRB","GBR","BRG","BGR","RGB","RBG"};
    for (int k=0;k<6;k++)
    {
      int p=0,ti=0;
	  for (int i=0;i<len;i++)
	    {
	    	if (s[k][p]!=st[i]) ti++;
	    	p=(p+1)%3;
	    }
	  if (ti<ans)
	  {
	  	ans=ti;
	  	w=k;
	  }  
	}
	cout<<ans<<endl;
	for (int i=1;i<=len/3;i++)
	  cout<<s[w];
	for (int i=0;i<len%3;i++)
	  cout<<s[w][i];  
}
发布了39 篇原创文章 · 获赞 0 · 访问量 556

猜你喜欢

转载自blog.csdn.net/weixin_45723759/article/details/104064345