公式
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)\) です.
投稿日時:
最終更新: