公式

A - Dial Up 解説 by maroonrk_admin


\(a\) をシフトする回数を数えます.\(T\)\(S_1\) のみからなる場合は明らかに \(0\) です.

そうでないケースを考えます. まず \(S\)\(S_1\) と異なる文字が存在しない場合,答えは \(-1\) です.

そうでない場合を考えます. \(S\) の中で最も先頭に近い \(S_1\) と異なる文字の位置が \(x\),最も遠い位置が \(y\) であるとします. \(T\) の中ではじめて \(S_1\) と異なる文字が現れた時,\(a\) をシフトし,\(x\) 番目か \(y\) 番目だった値を先頭に持ってくる必要があります.

ではさらにその後,\(T\) の中に \(S_1\) と同じ値が現れたときはどうなるでしょうか? このとき,\(x\)\(y\) のとり方から,一度シフトするだけで \(a\) の先頭に \(S_1\) と同じ値を持ってくることができます.

これ以降も同じ議論を使うことで,直前と異なる値が必要になる度に,\(1\) 回のシフトで必要な値を\(a\) の先頭に持ってくることができます.これは明らかに最小手数です. よって,\(x\) 番目を使う場合の手数と \(y\) 番目を使う場合の手数の最小値を求めて答えとすればよいです.

計算量は \(O(N+M)\) です.

投稿日時:
最終更新: