【Upsolve】 Remove the Substrings (hard version) - Codeforces Round #579 (Div. 3) D2

問題

codeforces.com

解法

  1. sの右側から貪欲にtの要素を拾っていったときに,t[i:|t|]が作れる最初のインデックスxをr[i]と定義します.言い換えると,s[x:|s|]からt[i:|t|]を作ることができるような最も右側のxをr[i]と定義します.各i(1<= i <= |t|)についてr[i]を事前に計算しておきます.

  2. 各j(1<= j <= |s|)について,jから最大で何文字切り取れるか,を全探索します.つまり,s[j:y)を切り取ったあとの文字列からtを作ることができるような最も右側のyを探します.ここで,左側から貪欲にtの要素を拾っていったときに,0~j-1の間でt[next-1]文字まで回収できていたとします.このとき,次に必要となる要素はt[next]です.r[i]の定義からyを最大化するためには,y=r[next]とすれば良いことが分かります.よって,jから最大で何文字切り取れるかの答えはr[next]-jとなります.ただし,そもそもtを作れないケースや,jまででtの要素をすべて回収できるケースがあるので,別途場合分けが必要です.

ソースコード

codeforces.com

躓いたところ

何を固定して全探索すれば良いか分からなかった. 間に合うはずのないDFSを書いてしまったのも反省点.