CS Academy FIICode 2019 Round #3 - Array Macao
しょうもないバグで間に合わなかったのだが、想定解より遅い方法を取ってしまったのでメモしておく。以下、すべて0-basedとし、整数kの10進表示に含まれる数字の集合をD(k)とする。
fA(i,d)={aiを末尾とする最長列の長さ0(d∈D(ai))(d∈/D(ai))fB(i,d)={biを末尾とする最長列の長さ0(d∈D(bi))(d∈/D(bi))
とすると、答えは
max(d∈[10]maxi∈[n−1]maxfA(i,d),d∈[10]maxi∈[n−1]maxfB(i,d))
であり、漸化式は次のように書ける。
fA(i,d)=⎩⎪⎨⎪⎧1+maxl∈D(ai)maxk∈[i−1]fB(k,l)10(i≥1かつd∈D(ai))(i=0かつd∈D(a0))(d∈/D(ai))
fB(i,d)={1+maxl∈D(bi)maxk∈[i−1]fA(k,l)0(d∈D(bi)かつ第2項≥1)(それ以外)
fAとfBが微妙に異なるのは、biを先頭にした列が作れないからである。漸化式のmaxk∈[i−1]f(k,l)の部分は数字lに対応するBITがあればO(logn)で求まるので、計20本のBITを用意することで全体としてはO(nlogn)になる。(350msくらいでAC。)
しかし、解説にある通り、以下の通りにDPすればO(n)で求まるはず。
fA(k,d)= 問題を{0,...,k}に制限したとき、末尾が(ai)i∈[k]から選ばれていてかつ数字dを含む数であるような最長列の長さ。
fB(k,d)= 問題を{0,...,k}に制限したとき、末尾が(bi)i∈[k]から選ばれていてかつ数字dを含む数であるような最長列の長さ。