Manachar(馬車車)

考え

私たちは、セット\(RAD [i]は\)で表さ\(私は\)を対称回文配列の時点まで。

今設定\(RAD [1..k-1] \)のために良いとされている\([1..k-1] \ ) パリンドローム配列を対称点最も遠い位置に一致する\(P \)対称の点\(A \) すなわち\(A + RAD [A] -1 = P \)

今、私たちは計算する必要がある(RAD [K] \)\を、もし\(K> = P \) そして暴力を更新します。
もし\(K <P \) 我々は知っているパリンドローム性質、\(S [A + 1..p]のS = [* AP-1..2] \) 次いで、(逆)\( K \)位置\(RAD \) を参照することができる(2 * AK \)\位置\(RAD \)

明らかに、場合\(K + RAD [2 * AK] -1 <P \)、\ (RAD [K] = RAD [2 * AK] \) あまりにも多くの水が複製されていない証明しました

場合\(K + RAD [2 * AK] -1> = P \)は、上記導出ケースから明らかである(\ [2 * AK] RAD [K]> = RAD)\、しかしとして\(RAD [ ] \)kは、我々は、私たちは暴力を一致させる必要がある知っているが、最初から暴力と異なる一致していませんどのくらいの最大エネルギー、我々からすることができます\(ラジアン[k]は+1 \ ) と一致し始め、その後、更新(\を\)\(のP- \)

各点は一度だけ訪問されるので、時間計算量があるので\(O(N)\)です。

コード(もっとすべき)

おすすめ

転載: www.cnblogs.com/featherZHY/p/11334090.html