Xmas Contest 2018 H: Hello, Xmas Contest 2018 解説
https://atcoder.jp/contests/xmascon18/tasks/xmascon18_h
問題概要
文字列 が与えられる.グリッドの一部に A
-Z
または *
を書いて,
- 各行の最初の非空白文字を順に繋げて
*
を除いた文字列が - 各列の最初の非空白文字を順に繋げて
*
を除いた文字列が
となるようにする.最低何文字書く必要があるか? (入出力例の図を見るのがわかりやすいです)
解法
ある文字 が に 回, に 回現れたとすると,文字 は少なくとも 個書かなければいけません.これを A
-Z
について足すことで答えの下界が得られます.
この下界はだいたい達成できそうな気がします:
|AAACCB -+------ A|A..... A|.AA... B|.....B C|...CC. B|......
具体的には, と の両方に現れる文字は問題なく配置できます.片方にしか現れない文字がある場合は,
|UNAGI -+----- U|UN... S|S.... A|..A.. G|...G. I|....I
|BAD -+--- A|.AD B|B.. C|C..
のように 行目の文字や 列目の文字で隠してしまえばよいです.隠せないのは,
|AC -+-- W|.. A|AC
のように 行目の文字が に現れない場合,あるいは 列目の文字が に現れない場合,のみです.そのような場合は *
を 個以上書く必要があり,逆に *
を 個左上に書いてしまえば隠したい文字を隠せます (看板を作ることが不可能なケースはありません).
まとめると,
A
-Z
のそれぞれについて, に現れる個数と に現れる個数の をとって足し,- の先頭が に含まれない,あるいは, の先頭が に含まれない,という場合だけ を足す
と答えになります.
コメント
最初は,色のついた積み木を積んだときの見取り図が 方向から与えられる,という設定で解こうとしていて,しかし高さ 以上のときわからなかったので高さ にしたら,無意識に昨年の問題と同じような設定になっていました.
制約は,解法を絞らせないために敢えてゆるくしました.