D - 1122 Substring 解説
by
seekworser
本問題は、最終的な 1122 文字列が元の数列の奇数番目/偶数番目いずれから始まるか、の場合分けが煩雑ですが、より簡便に処理する方法です。
数列 \(A\) のランレングス圧縮 を \(((v_1, l_1), (v_2, l_2), \dots, (v_k, l_k))\) とします。空の数列 \(B\) に対して、\(i = 1,2,\dots, k\) の順に以下のルールで要素を追加します。
- \(l_i < 2\) の場合、数列 \(B\) に \(-1\) を追加する。
- \(l_i = 2\) の場合、数列 \(B\) に \(v_i\) を追加する。
- \(l_i > 2\) の場合、数列 \(B\) に \(v_i, -1, v_i\) をこの順に追加する。
このようにして得られた数列 \(B\) 対して、以下の問題の解を考えます。
数列 \(B\) の連続する部分列であって、同じ数字を含まずかつ \(-1\) を含まないようなもののうち最長のものの長さはいくつか?
変換された数列 \(B\) に対する問題は、以下の問題とほぼ同等な問題です。(\(-1\) を含まない、という条件が追加されていますが、元の問題の解法をこの条件を含むものに容易に拡張可能です)
数列 \(B\) に関する問題を解いた答えを \(ans\) として、元の問題の答えは \(2 \times ans\) であるため、これを出力すればよいです。
投稿日時:
最終更新:
