E - Stamp Editorial by shiomusubi496

DPを用いる解法

以下 0-indexed とします。

前から順番に bool 値を持つ DP を行います。

\(\mathrm{dp}[i][j]\) \(:=\) \(X[0, i)\)\(S[0, i)\) に一致し、最も右側で操作をしたのが \(X[i-j, i-j+M)\) である、という状態が可能か

便宜上 \(j=M\) まで用意します。

初期化は \(\mathrm{dp}[0][0]\) のみ \(\mathrm{true}\) とすればよいので、遷移を考えます。

まず、 \(X[i, i+M)\) で新たに操作を行う場合、 \(\mathrm{dp}[i][j]\) から \(\mathrm{dp}[i][0]\) へ遷移をします。
次に、既に行った操作より前に被らせるように \(X[i-k, i-k+M)\) で操作を行う場合、 \(\mathrm{dp}[i][M]\) から \(\mathrm{dp}[i][k]\) へと遷移を行うことができます。
最後に、 \(S_i = T_j\) ならば \(\mathrm{dp}[i][j]\) から \(\mathrm{dp}[i+1][j+1]\) への遷移が行われます。

よって \(O(NM)\) でこの問題を解くことができました。

コード (C++, 18ms)

posted:
last update: