接尾辞配列:

1、違い:
2箇所のカード。
図1は、より多くのまたは省略してもよいカウント値に等しいです。それをShoumoします。トップに書かれたカバー、単に等しくありません。x == yを、IDX <IDY、 L 、および異なるID。Lのyは、IDX + 1として記録しなければならない
、それ以外の場合は、マルチオペレータ、繰り返しあろう。だから、単調なスタックは<=です。
図2は、L、Rのを計算することです。(I-ID [トップ])、I-ID + 1の書き込み前に
プロパティ:ランクiは、LCPのサフィックスJは、(i <jの)分{高[K] | iは + 1つの≤k個の≤jを}
シグマ(レニ、J)=( N-1)×(N + 1)* N / 2 N-1は、 計算は、それぞれのn-1倍であるています。プレフィックスと続きます。
翻訳:LCPを求めています。heigh [I]を求めていることは、最小間隔となります。
    単調なスタックのメンテナンス。小難しさはShoumoそれの値に等しいです。

#include <cstdioを> 
する#include <CStringの> 
する#include <アルゴリズム>
 の#define F(I、A、B)(INT I =レジスタA; Iは= Bを<; I ++の)のため
 の#define forb(I、A、 B)(I =レジスタAをint型のため、I> = B; - I)
 の#define ILインライン
 の#define LLロングロング
 の#define RGレジスタ
 #defineする PF(A)のprintf( "%のD"、A)は
 #defineする PFを(A)のprintf( "%のLLD"、A)
 の#define PHNプット( "")
 使用して 名前空間はstd;
 int型読む();
 / * 
カード2ヶ所インチ 
図1は、より多くのまたは省略してもよいカウント値に等しいです。それをShoumoします。トップに書かれたカバー、単に等しくありません。x == yを、IDX <IDY、 L 、および異なるID。Lのyは、IDX + 1として記録しなければならない
、それ以外の場合は、マルチオペレータ、繰り返しあろう。だから、単調なスタックは<=です。 
2はL、Rのを計算することです。(I-ID [トップ])、I-ID + 1の前に書かれています。
プロパティ:ランクは、IであるLCPのサフィックスJは、(i <jの)分である| {高[K] I + 1≤K≤J。} 
シグマ(レニ、J)=(N - 1)*(N + 1)。 * N / 2 N-1の計算は、それぞれのn-1倍であるです。プレフィックスと続きます。
翻訳:LCPを求めています。heigh [I]を求めていることは、最小間隔となります。
    単調なスタックのメンテナンス。小難しさはShoumoそれの値に等しいです。
* / 
#DEFINE NX 500 010
 INT N-、M;
 CHAR STR [NX];
 int型A [NX]、SA [NX]、高さ[NX]、RK [NX]、税金[NX]、TP [NX];
 無効Rsortを(){ 
    F(I、0、m)の税[I] = 0 ; 
    F(I、1、N-)++ 税[RK [TP [I]]]; 
    F(I、1、m)の税[I ] + =税[I- 1 ]; 
    forb(I、N-、1。)SA [税[RK [TP [I]]] - ] = int型TP [i]は、
}
 CMP(int型 * Fを、int型のx、int型の Y、INT W){ リターン [X] == F [Y] && FをF [X + W] == F [Y + W];}
 ボイドサフィックス(){ 
    F( I、1、N)RK [i]は[I]、TPを= [I] = I。
    M = 127 ; Rsort()。
    INT W = 1、P = 1 ; P <N;、I << = W 1、M = P){
         ため(p = 0 +、I = N-W 1 ; iが<= N; I ++) TP [++ P] = I。
        F(I、1、n)の場合(SA [I]> W)TP [++ P] = SA [I] - W。
        Rsort();スワップ(RK、TP); RK [SA [ 1 ] = P = 1 
        F(I、2、n)はRK [SA [I] = CMP(TP、SA [i]は、SA [I- 1 ]、W)P:++ P。
    } 
    int型 J、K = 0 以下のためにint型 i = 1 ; iは= N <;高さ[RK [I ++] = K)
         のための(K = K K-?1:K、Jは=のSA [RK [1] - 1 ]、[I + K] == [J + K]; ++ K); 
} 
INT STA [NX]、ID [NX]、BG [NX]、トップ。
INT メイン(){ 
    scanf関数(" %sの"、STR + 1); 
    n個= STRLEN(STR + 1 )。
    F(I、1、N)[I] = STR [I]。
    サフィックス(); 
    LL ANS = 1LL *(N- 1)*(N + 1)* N / 2 //   F(I、1、N)PF(RK [I]); PHN。
  //   F(I、1、N)PF(身長[I]); PHN。
    高さ[N + 1 ] = - 1 //   PF(ANS)。
    F(I、1、N + 1 ){
         一方(上部&& STA [トップ]> 高さ[I]){ 
            ANS - = 2LL *(ID [トップ] -bg [トップ])*(I-ID [トップ])* STA [上 - ]; // PF(ANS)。
        }
         もし(!トップ){ 
            STA [ ++トップ] =高さ[i]は、ID [トップ] = I; BG [トップ] = 0 ; 
        } 
        {
         //     もし(STA [トップ] =高さ[I]!){ 
               STA [++トップ] =高さ[i]は、ID [トップ] = I; BG [トップ] = ID [トップ1 ]。
        //     } 
        } 
    } 
    のprintf(" %のLLD " 、ANS)。
} 
のIL int型リード(){ 
    RG INT S = 0、F = 0 ; RG チャーCH。
    一方 ==(CH = GETCHAR()、CH' - '?F = 10、CH < ' 0 ' || CH> ' 9 ' )。
    一方、(CH> = ' 0 ' && CH <= ' 9 ' ){ 
        S = sの* 10 +(CH ^ 48)、CH = GETCHAR()。
    } 
    戻りS。
} 
/ * 
G ++ 1.cpp -g 
./a.out 
eededeedeedeedde 

* /
コードの表示

 

おすすめ

転載: www.cnblogs.com/seamtn/p/11297648.html
おすすめ