2019年7月19日金曜日

天下一プログラマーコンテスト2016本戦 C - たんごたくさん

天下一プログラマーコンテスト2016本戦 C - たんごたくさん

S:=a0a1...,an1S := a_0a_1...,a_{n-1}の連続部分列alal+1...ar1a_la_{l+1}...a_{r-1}S[l,r)S[l, r)と書くことにする。文字列S[i,n)S[i, n)に対して問題の操作を行った時の最大値をf(i)f(i)とするとき、

f(i)=maxi<k200(S[i,k)+f(k))f(i) = \max_{i < k \le 200} \bigr(S[i, k)の重さ + f(k) \bigl)

だから、DPしてf(0)f(0)を求めればそれが答えである。(ただし、PPに含まれない単語の重さは00とする。)S[i,k)S[i, k)の重さを求める部分で、部分列がPPに含まれているかを素朴に判定すると間に合わないので、Trieやローリングハッシュを使う。


Trieの例題として解いたのだが、よく見るとローリングハッシュでも問題なかった。ただ、後者はかなり重い。