Google Code Jam 2019 Round1C : Robot Programming Strategy

問題. Robot Programming Strategy

 N = 2^K 人でじゃんけんによるトーナメント戦を行う.相手は  N - 1 人いて  i 番目の人はどんな対戦相手でも文字列  C_i で表される戦略にしたがって手を出す.初手は  C_i の1番目の手を出して,引き分けなら2番目と勝敗がつくまでじゃんけんをする(引き分けの回数が  C_i の長さを越したら1番目から繰り返す).引き分けが  10^{100} 回超えたらランダムに勝者を決める.
対戦相手  N - 1 人の手が事前に分かるときに,どんな組合せでも優勝することができるような戦略を求めよ.そのような戦略が存在しない場合は "IMPOSSIBLE" と出力せよ.ただし,その戦略が表す文字列の長さは 1 以上 500 以下とする.

制約 2 \le N \le 256,  1 \le |C_i| \le 500

解法

どんな組合せでも優勝できるような戦略が存在するということは,戦略  C によってすべての対戦相手に勝つことができるということである.したがって, N - 1 人の対戦相手と並列に最大で 500 回までじゃんけんを行いながら戦略を決めることを考える.
 i 回目のじゃんけんで相手の手の種類が 3 種類あるときは,どのような手を出して勝つことができないので答えは "IMPOSSIBLE" である.相手の手の種類が 1 種類のときは,その手に勝つ手を  i 回目で選ぶことによって優勝することができる.この場合はこれ以降じゃんけんをする必要はない.最後に,相手の手の種類が 2 種類のときは,引き分けとなる手を選択することによって  i + 1 回目のじゃんけんに進むことができる.このとき,出した手によって勝つことができる相手が少なくとも 1 人いるが,そのような対戦者は  i + 1 回目以降で対戦者として考慮する必要はない.このように戦略を決めて引き分けが 500 回を超えたなら答えは "IMPOSSIBLE" となる.

計算時間 O(N |C|)

某アイドルグループのじゃんけん大会かな