牛客網 提高組第8周 T1 染色
染色
連結:
https://ac.nowcoder.com/acm/contest/176/A
來源:牛客網
題目描述
\(\tt{fizzydavid}\)和\(\tt{leo}\)有\(n\)個方格排成一排,每個方格初始是白色。\(\tt{fizzydavid}\)有紅色染料,\(\tt{leo}\)有藍色染料。他們共進行了\(m\)次操作,在每次操作中,\(\tt{fizzydavid}\)或者\(\tt{leo}\)會選擇若干個(可以是零個)連續相鄰的方格並用自己的染料給這些格子染色。當一個格子被染成某個顏色時,這種染料會覆蓋之前這個格子上的顏色。
現在你並不知道他們每次操作選擇了哪些格子,只知道每次操作是誰進行的,以及最終這 \(n\)
輸入描述:
第一行包含一個整數\(T\),表示本組資料共有\(T\)組測試點。
對每組測試點的第一行是一個由\(R\)和\(B\)組成的字串\(s\)表示最終格子的顏色。\(R\)表示紅色,\(B\)表示藍色,同時字串的長度為\(n\)。
第二行是一個由\(F\)和\(L\)組成的字串\(t\)表示\(m\)次操作,\(F\)表示某次是\(\tt{fizzydavid}\)操作,\(L\)表示是\(\tt{leo}\)操作,同時字串的長度為\(m\)
輸出描述:
對每組測試點輸出一行,如果滿足條件輸出\(\tt{Yes}\)否則輸出\(\tt{No}\)。
說明
所有資料滿足\(T\le 20\)。
\(50\%\)的資料滿足\(n,m\le 15\)
\(80\%\)的資料滿足\(n,m\le 100\)
\(100\%\)的資料滿足\(n,m\le 100000\)
恩,啥也沒想到,一開始就沒想到要倒著做。
考慮倒著操作,那麼顏色是不會覆蓋原來的顏色的。那麼每個格子顯然只會最開始被染上一次顏色,且這個顏色必須是要求的顏色。
很自然的把連續的顏色區間縮成一個點,那麼序列會變成形如\(RBRBRB\)這樣子的。
很自然的貪心先從中間染色,這樣就可以把這個點兩邊的區間合成一個。特判一下兩邊就可以了。
Code:
#include <cstdio>
#include <cstring>
const int N=1e5+10;
int n,m,T;
char op[N],s[N];
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%s%s",s+1,op+1);
n=strlen(s+1),m=strlen(op+1);
int las=s[1]=='R',re=0,bl=0;
for(int i=2;i<=n;i++)
if(las!=(s[i]=='R'))
re=re+las,bl=bl+(!las),las=(s[i]=='R');
re=re+las,bl=bl+(!las);
for(int i=m;i;i--)
{
if(op[i]=='F')//染紅
{
--re;
if(bl>=2) --bl;
}
else
{
--bl;
if(re>=2) --re;
}
}
if(re<=0&&bl<=0) puts("Yes");
else puts("No");
}
return 0;
}
2018.11.4