問題はこちら
問題概要
長さの文字列と長さの文字列が与えられる. 空文字列を用意して, の先頭か末尾にを挿入していくことを考える. の接頭辞がに等しくなるような挿入の仕方の総数を998244353で割った余りを求めよ.
思考の流れ
制約や操作からDPっぽさを感じるのでDPを考える.
「の番目までを使用」ってのはいるとして, 「になる」というのがあればよさそうだが空間計算量で無理.
が決まるとの長さも決まるのではいらないっぽい.
を「の番目までを使ってと一致する文字列を作るときの操作の数」とする.
が範囲外になることがあるが, そのときは範囲内までのものを考える. つまりを考える.
のとき
までできているときに, 前にをつければが作れる.のとき
いままでどのような操作を行って, どのような文字列になったかは関係ない. よってを足せばいい.のとき
までできているときに, 後ろにをつければが作れる.のとき
までできているときに, 後ろにをつけるとが作れる.
以上のことを遷移式としてやるとできる. 具体的な実装はプログラムを参照.
提出プログラム
https://codeforces.com/contest/1337/submission/79305770
感想
DP定義の時点で分からなかった. どの状態がいらないか判断するの難しい.
コドフォ民の正解率高かったけどコドフォ民はDPが得意?