E - Missing Subsequence Editorial by noimi

$O(N^2)$

以下 0-indexed とする。

条件を満たす \(A\) の構造を考える。

\(A\) を先頭から見て初めて \(X_0\) が現れるインデックスが \(t\) であったとする。

条件から \(A[t + 1: N]\) において、\(X[1 : M]\) は現れない。

\(p \neq X_0\) については \((p, X_1, \ldots, X_{M-1})\) が部分列として現れる必要があることから、\(A[0 : t + 1]\) において、\((p, X_1)\) が部分列として現れる必要がある。 つまり、\(A\) の prefix について、

\(p \neq X_0\) がすべて現れた後に \(X_1\) が現れ、その後 \(X_0\)初めて 現れる。(ただし、\(X_0 = X_1\) の場合は \(X_1\) に関する条件が自然に満たされる。)

という条件が満たされている必要がある。

この条件が満たされたとき、考える必要がある部分列は \(X_0\) から始まるもののみなので、\((A, X) = (A[t + 1 : N], X[1 : M])\) と取り替えたものについて、同様の条件を満たせばよいことがわかる。

このことから、以下のように \(dp\)[\(i\)][\(j\)][\(k\)][\(c\)] を定義することで動的計画法が設計できる。

\(i\) : \(A\) の先頭何項を決めたか

\(j :\) 考えている \(X\)\(X[j : M]\)

\(k: \) \(X_j \neq p\) のうち、\(K\) 種類が現れた

\(c: \) \(K - 1\) 種類すべてが現れたあとに、\(X_{j + 1}\) が登場したかどうか

答えは \(dp[N][M - 1][K - 1][0]\) である。 また、dp の遷移は定数個なので、この問題を \(O(NMK)\) で解くことができた。

ところで、dp の遷移を考えると \(j\) が 1 増えるのに、\(i\) は少なくとも \(K\) 回増加する必要がある。 このことから、\(N < MK - 1\) ならば答えは \(0\) である。

よって、\(O(MK) = O(N)\) とみなすことができ、全体で \(O(N^2)\) でこの問題を解くことができた。

posted:
last update: