定義
[LCP]のフルネーム最長の共通のプレフィックス、 2つのサフィックス間の最長プレフィックスは、我々は次のように定義します
LCP(i、j)を意味することは、最長プレフィックスとサフィックスiとjであります
関数[z]は関数z [i]は、文字列の最も長い接頭辞と接尾辞Iを表します
[問題]
どちらも、この問題を解決していました
すなわち、接尾辞との間で最長共通接頭辞と接尾辞の文字列を求めて
しかし、何かが違います、
最後にすることを決定するために、接尾辞配列最長の共通のプレフィックス辞書サフィックスi番目とI + 1番目の接尾辞を
Zの機能は最終的に決定すること、文字列の最長共通接頭辞と接尾辞I
そして、最長共通接頭辞によって他の値を見つけます
] [アルゴリズムを学びます
接尾辞配列[]
接尾辞配列は、n時間で得ることができる辞書 i番目およびI - 1つの最長の共通のプレフィックスサフィックス
そして、この関数は通常の高さと命名されました
高さを意味[i]のために、ある辞書的にI -最長共通接頭辞とi番目の接尾辞の接尾辞
得られた以下の特性を有する:(S [i]はi番目のサフィックスを示します)
1. iはjを、LCP(I、J)= minより小さければ{LCP(k - 1、K)、I + 1 <= K <= J}
LCPはRMQで、この需要を活用することができます
i番目のサフィックスが辞書順で彼の前と接尾辞のLCPで起動します。2. H [i]は、以下のように定義します
即:H [I] =高さ[順位[I]
すると、そこにあるI> 1とランク[i]は> 1のために
H [I]> H [I - 1] - 1。
次のように証明します:
接尾辞順位位置の手前に着手し始めて1サフィックス - そして、jは最初のiであります
注意:jは最初のiではありません - 2
この場合、サフィックスj番目およびI - 、すなわち時間[iは、 - 1] - LCPサフィックス定義高さ[1]ランク[I]で1番目
それは証明するために、私たちの右半分の一部であり、
その後、我々がj + 1を議論し、私は、(iによって得られた - 1 + 1)の関係:
まず、jおよびI - 文字が等しくない1、hは[I - 1]が0であります
明確次いでH [I]> H [I - 1] - 1
第二、jおよびI場合 - 1は、ケースの最初の文字に等しく、
明らかに、その後、jおよびI - 1 - LCP 1はH [ - 1 I]であります
私の試験よりサフィックスのランキング、および接尾辞では、私は、LCPの最長の、最も類似度は最近、彼から離れてSAに明確です
即 SA [ rank [ i - 1] ] - 1
すなわち、時間[I]> = Hであり、[I - 1] - 1
QED
だから我々は時間から利用可能な最長のプレフィックスを見つけるたびに[私は - 1]取得を開始します
類似manacherです
コードは以下の通りであります:
ボイドのgetHeight(){ int型 J、K = 0 。 用(int型 i = 1 ; iが<= N iが++ ){ もし k--(K) 。 int型 J = SA [RAK [I] - 1 ]; 一方、(S [I + K] == S [J + K])は、k ++ ; 高さ[RAK [I] = K。 printf(" %d個の\ n " 、K)。 } }
トピック:
[SDOI 2008]サンディカード