题目大意
有一个长度为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];
}