コンテストページ: https://atcoder.jp/contests/abc287
コンテスト中AC: A〜E
C - Path Graph?
パスグラフのとき、両端の次数は1で、それ以外は2です。また、連結成分の数はただ1つになる必要があります。
以上から、以下がパスグラフである条件です。
- 次数1の頂点がちょうど2つ存在し、その他の頂点の次数は全て2
- 連結成分がただ1つ
上は、次数をカウントしていくことで判定でき、下はUnion Findにより、判定できます。
D - Match or Not
の先頭及び末尾からの何文字目までが一致させられるかをあらかじめ計算しておき、その情報を合体させます。
具体的には、bool型の配列を以下のように定義します。
の先頭から
文字目と
の先頭から
文字目までを一致させられるならtrue、一致させられないならfalse
とし、同様に、先頭を末尾に言い換えたものをとします。
ここで、便宜上とします。
の場合には、一致できるかを
として判定できます。
は、先頭または末尾の端から順に調べていき、
番目の
について、
となったらそれ以降は全て一致させられなくなるので、全てfalseで、それまでは全てtrueとします。
E - Karuta
少し前の問題でRolling Hashを使っていたので、Rolling Hashで解きました。
の
文字目までのハッシュ値を
とします。
全てのについて、
の個数を連想配列でカウントします。
改めて、番目の文字列について、
の個数が全体で何個あるかを調べていき、ハッシュ値の数が2以上であるものは自分以外にもそのハッシュ値を持つ文字列が存在することを示しているので、その中で最大のものが答えになります。
(コンテスト後に実装見直し)