1. 程式人生 > >牛客網 提高組第8周 T1 染色

牛客網 提高組第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\)

個方格的顏色。你需要判斷是否存在某種選擇格子的方式使得操作完之後\(n\)個方格的顏色與給定的相同。你還發現,\(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