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 = 1:0、CH < ' 0 ' || CH> ' 9 ' )。 一方、(CH> = ' 0 ' && CH <= ' 9 ' ){ S = sの* 10 +(CH ^ 48)、CH = GETCHAR()。 } 戻りS。 } / * G ++ 1.cpp -g ./a.out eededeedeedeedde * /