T89353 【BIO】RGB三角形

题解

对于这个题目有一个规律:

 如果一个数列的长度为 3+1(0<=k) 那么,这个数列最终缩放成的一个字母只和这个数列的首项,尾项有关

所以我们可以先判断输入的这个数列长度是否为 3+1(0<=k) ,如果是,那就直接处理好了

否则就找到一个最大的 3+1,然后把这个数列划分成更多的这么长的小区间,一点点处理

每次处理后序列长度都会缩短,那么相应的 3+1也要更新

最后处理到只剩下一个字母啦,就是答案了

代码

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<queue> using namespace std; inline int read()
{
int ans=;
char last=' ',ch=getchar();
while(ch<''||ch>'') last=ch,ch=getchar();
while(ch>=''&&ch<='') ans=ans*+ch-'',ch=getchar();
if(last=='-') ans=-ans;
return ans;
} int n,len,m;
int l[]={,,,,,,,,,,,,,,};
string s; int main()
{
// freopen("t5.in","r",stdin);
// freopen("yy.txt","w",stdout); n=read();m=n;
cin>>s;
if(n==)
{
cout<<s[];
return ;
}
while(m)
{
for(int i=;i<;i++)
{
if(l[i]<=m) len=l[i];
else break;
}
if(len==m)
{
char a1=s[],a2=s[m-],a3;
if(a1==a2) a3=a1;
if((a1=='R'&&a2=='G')||(a1=='G'&&a2=='R')) a3='B';
if((a1=='R'&&a2=='B')||(a1=='B'&&a2=='R')) a3='G';
if((a1=='B'&&a2=='G')||(a1=='G'&&a2=='B')) a3='R';
cout<<a3<<endl;
return ;
}
for(int i=;i<m-len+;i++ )
{
char a1=s[i],a2=s[i+len-];
if(a1==a2) s[i]=a1;
if((a1=='R'&&a2=='G')||(a1=='G'&&a2=='R')) s[i]='B';
if((a1=='R'&&a2=='B')||(a1=='B'&&a2=='R')) s[i]='G';
if((a1=='B'&&a2=='G')||(a1=='G'&&a2=='B')) s[i]='R';
}
m-=(len-);
} cout<<s[]; return ;
}
05-06 12:59