torus711 のアレ

主に競技プログラミングの問題について書きます.PC 以外だと数式が表示されないかもしれないです

AtCoder Beginner Contest 337, B : Extended ABC

問題概要

 文字列 $S$ が与えられる.$S$ は以下で説明する $A, B, C$ で $A + B + C$ の形で表せるか?*1

  • $0$ 個以上の文字 $`\text{A'}$ からなる文字列を $A$ ,$0$ 個以上の文字 $`\text{B'}$ からなる文字列を $B$ ,$0$ 個以上の文字 $`\text{C'}$ からなる文字列を $C$ とする.

制約

  • $1 \leq |S| \leq 100$

解法

 別に賢い方法もあるのですがソレは無視して題意から直接解釈すると,条件を満たす $S$ とは,

  • 連続する同じ文字を $1$ 文字に潰したとき,
  • $``\text{ABC''}$ の部分列になるような $S$ .

と言えます.Haskell では前者は group と head,後者は isSubsequenceOf という関数があるので,以下のように一行で事足ります.

コード

main = getLine >>= putStrLn . ( \f -> if f then "Yes" else "No" ) . ( `isSubsequenceOf` "ABC" ) . map head . group

*1:ここで二項演算子 $+$ は文字列の連結を表す.