D. Colorful Stamp题解
题目大意
给定一个长度为n的字符串,字符串初始状态都由字符“W”组成。然后可以对这个字符串进行若干次操作:将这个字符串中的两个连续的字符染色成“RB”或者“BR”,可以重复染色。
题目会给你一个长度为n的字符串,这个字符串是已经被染色了的字符串,你需要判断这个字符串能不能通过若干次染色从初始状态染色成这个状态。如果能,输出YES,否则输出NO。
解题思路
浅分析一波,先不考虑W的事儿,如果字符串长度为1,啊那直接出NO。如果长度大于等于2,如果R不是0个但是B个数为0,或者B不是0个但是R个数为0(即全是R或者全是B),那也不成。
那如果有W呢,比如说R在两段,RW、WR、BW、WB这种,啊一看就不成。还有就是RRW、BBR、BBBW、RRRW这种,出了端点的W其他全是R或者全是B,也不成。其实说白了就是前面说的那些情况端点加了一个W嘛。
那如果W在字符串中间呢,其实也一样,可以把这个字符串看成被字符“W”分割成的若干段,这不就又一样了嘛,哈哈。
总结:只要这个段里面没有出现全是R或者全是B的情况,那就成。
代码如下:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=1e5+5;
char s[N];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d %s",&n,s);
s[n]='W';
int flag=0;
int r=0,b=0;
for(int i=0;i<=n&&flag==0;i++)
{
if(s[i]=='W'){
if(!r&&b||r&&!b)flag=1;
r=0;
b=0;
}else{
if(s[i]=='R')r++;
else b++;
}
}
if(flag==1) printf("NO\n");
else printf("YES\n");
}
return 0;
}