AtCoder Beginner Contest 287 E問題 Karuta
問題
提出解答
問題の概要
個の英小文字からなる文字列 が与えられる.
2つの文字列 に対して, を以下を満たす最大の非負整数 と定義する.
- の先頭 文字が一致する.
このとき, に対して, 以下の を求めよ.
制約
- は英子文字列
解法
各 に対して, 非負整数 において とする. このとき, 以下は同値である.
- の先頭 文字を prefix とするような文字列が の中に ( を含めて) つ以上存在する.
このとき, のうち, prefix が であるような文字列の個数を求めるとき, Trie 木を利用することによって, 時間で判定できる.
このことを利用して, 次のようにすることで正解できる.
- から Trie 木 を生成する.
- の順に以下を実行する.
- の順に以下を実行する: における 文字目を表している頂点 へ移動する *1. を根とする部分木において, 末端文字を担う頂点の数が 未満になるならば, として, 繰り返しを終了する.
- でも が確定しなかった場合は である.
この方法によって, 時間で を求めることができた.
*1: の作り方から必ず存在する.