誤解しない限り、最小コストの因数分解は次のようにO(n2)時間で計算できると思います。
各インデックスiについては、我々は、値の束計算する(pℓi,rℓi)ためℓ=1,2,…次のように。ましょうp1i≥1の整数が存在するような整数で最小であるr≥2満足S[i−rp1i+1,i−p1i]=S[i−(r−1)p1i+1,i].
この特定のp1iについて、r1iをこのプロパティを持つ最大のrとします。そのような場合pi存在し、セットLi=0我々が知っているように、ゼロがある(pℓi,rℓi)このインデックスの値。
ましょうp2iより厳密に大きい最小の整数である(r1i−1)p1i満たす、同様に、
S[i−r2ip2i+1,i−p2i]=S[i−(r2i−1)p2i+1,i]
いくつかのためのr2i≥2。前と同じように、r2iを固定のp2iを持つ最大のものとします。一般に、pℓiより厳密に大きい最小のそのような数である(rℓ−1i−1)pℓ−1i。そのような場合pℓi存在する場合、Li=ℓ−1。
注各インデックスiについて、我々が持っているLi=O(log(i+1))に起因するpℓi用いて幾何学的に増加する値ℓ。(場合pℓ+1i存在している、それだけで厳密により大きいではありません(rℓi−1)pℓiしかし、少なくともによって、より大きなpℓi/2。これは、幾何学的な増加を確立します。)
今、すべての仮定(pℓi,rℓi)の値が私たちに与えられています。最小のコストは漸化式で与えられ
dp(i,j)=min{dp(i,j−1)+1,minℓ(dp(i,j−rℓjpℓj)+dp(j−rℓjpℓj+1,j−pℓj))}
ためと理解さi>j我々が設定さdp(i,j)=+∞。テーブルはO(n2+n∑jLj)時間で埋められます。
上記のように、合計項を項ごとに区切ることにより、∑jLj=O(∑jlog(j+1))=Θ(nlogn)ことを既に観察しました。しかし、実際に全体を見ると、よりシャープなものを証明できます。
Sの逆のサフィックスツリーT(S←)(つまり、Sのプレフィクスツリー)を考えます。合計∑iLiへの各寄与をT(S←)エッジにチャージし(← S)、各エッジが最大1回チャージされるようにします。各pjiをnca(v(i),v(i−pji))から発してvに向かうエッジにチャージしますv(i−pji)。ここで、v(i)はS[1..i]対応するプレフィックスツリーの葉で、ncaは最も近い共通の祖先を示します。
これは、O(∑iLi)=O(n)ます。値(pji,rji)は、サフィックスツリーのトラバーサルによって時間O(n+∑iLi)で計算できますが、興味がある場合は詳細を後の編集に任せます。
これが理にかなっているかどうか教えてください。