天下一プログラマーコンテスト2016本戦 C - たんごたくさん
S:=a0a1...,an−1の連続部分列alal+1...ar−1をS[l,r)と書くことにする。文字列S[i,n)に対して問題の操作を行った時の最大値をf(i)とするとき、
f(i)=i<k≤200max(S[i,k)の重さ+f(k))
だから、DPしてf(0)を求めればそれが答えである。(ただし、Pに含まれない単語の重さは0とする。)S[i,k)の重さを求める部分で、部分列がPに含まれているかを素朴に判定すると間に合わないので、Trieやローリングハッシュを使う。
Trieの例題として解いたのだが、よく見るとローリングハッシュでも問題なかった。ただ、後者はかなり重い。