サフィックス(I):添え字i番目の文字から始まります
SAは、[I]:すなわちサフィックス "最初の数行た" サフィックスアレイ(SA [i])と<サフィックス(SA [I + 1])、1 <= iがN <
RA [i]は:ランキング配列、「あなた最初の数行」、RA [i]が「ランク」の昇順ですべてのサフィックスでのサフィックス(i)を表し、
最長の共通接頭辞順位隣接する2つのサフィックスである最長の共通接頭辞、接尾辞(SA [I-1])とサフィックス(SA [I]):高さ[i]は。
次に、jおよびkについて、提供ランク[J] <ランク[J]。
サフィックス(j)とサフィックス(k)は、最長の共通接頭高さ[RA [J] +1]、高さ[RA [J] +2]、高さ[RA [J] +3]、...、高さ[順位[K]]は最小です。
1、羅バレーP3809 [テンプレート]サフィックスソーティング
リファレンスはここ、倍増方法接尾辞配列バーを求めた後に使用されています。
1の#include <iostreamの> 2の#include <sstream提供> 3の#include <fstreamの> 4の#include <アルゴリズム> 5の#include <CStringの> 6の#include <iomanip> 7の#include <cstdlib> 8の#include <CCTYPE> 9#含む<ベクトル> 10の#include < ストリング > 11の#include <cmath> 12の#include <ctimeの> 13の#include <積層> 14の#include <キュー> 15の#include <地図> 16の#include < 設定 > 17 の#defineMEM(A、B)のmemset(A、B、はsizeof(A)) 18 の#defineランダム(B)(RAND()%(B-A + 1)+ A) 19 の#define LL長い長い 20 の#define ULL符号なし長い長い 21 の#define E 2.71828182 22件 の#defineパイACOS(-1.0) 23件 の#define LS(RT)(RT << 1) 24個 の#define RS(RT)(RT << 1 | 1) 25 の#define lowbit (X)(X&( - X)) 26 使用 名前空間STD。 27 のconst int型 MAXN = 1E6 + 5 。 28 チャーSTR [MAXN]。 29 INTN、M。 30 INT SA [MAXN]、RA [MAXN]、高さ[MAXN]。 31 のint WA [MAXN]、WB [MAXN]、WC [MAXN]、WD [MAXN]。 32 int型リード() 33 { 34 INT S = 1、X = 0 。 35 CHAR CH = GETCHAR()。 36 一方、 {(isdigit(CH)!)場合(CH == ' - ')S = - 1 ; CH = GETCHAR();} 37 ながら(isdigit(CH)){X = 10 * X + CH- ' 0 ' ; CH = GETCHAR();} 38 リターンのx * S; 39 } 40 空隙 GetSaRa(int型のn、int型 M)// 倍增法nlogn 41 { 42 のint I、J、P、* X = WA、* Yは= WB、* T。 43 のために(int型 I = 0 ; iが<M; ++ i)はWD [I] = 0 。 44 のために(int型 = Iを0 ; iがn <; ++ I)WD [X [I] = strの[I]] ++ ; 45 のために(int型 I = 1 WD [I] + = WD [1-; iが<M ++ i)が1 ]。 46 のための(int型I = N- 1、I> = 0 ; - I)のSA [ - WD [X [I]]] = I。 47 のために(J = 1、P = 1 ; P <N; J * = 2、M = P) 48 { 49 のために(P = 0、I = NJ; iがn <; ++ I)Y [P ++] = 私; 50 のために(i = 0 ; iは<N; ++ I)の場合(SAの[I]> = J)Y [P ++] =のSA [i]は- J。 51 のために(i = 0 ; iがn <; ++ I)WC [I] =のX [Y [I]]。 52 のためには、(i = 0 ; iがm <; ++ I)WD [I] = 0 ; 53 のための(I =0 ; iがN <; ++ ++ i)はWD [i]は、WC [] 。 54 のための(I = 1 [1- [I] + = WD WD ++ iは; iがm <)1 ]。 55 のための(I = N- 1、I> = 0 ; - I)のSA [ - WD [WC [I]]] = Y [i]は、 56 のために(スワップ(x、y)は、P = 1は、[SA [X 0 ] = 0、i = 1 ; iがn <++ I) 57 X [SA [I] = Y [SA [Iを- 1 ]] == Y [SA [I]] && Y [SA [I- 1 ] + J] == Y [SA [I] + J] P-?1:P ++ 。 58 } 59 } 60 ボイドのgetHeight(int型N) 61 { 62 のint I、J、K = 0 。 63 のためには、(i = 1 ; iが<= N; ++ I)RA [SA [I] = I。 64 のために(i = 0 ; iがn <;高さ[RA [I ++] = K) 65 のために?(K k--:0、j個の=のSA [RA [1] - 1 ]; STR [I + K] == STR [J + K]; ++ K); 66 } 67 のint main()の 68 { 69 のscanf(" %sの" 、STR)。 70 N =のSTRLEN(STR)。 71 STR [N] = '0 ' ; M = 200 。 72 GetSaRa(N + 1 、M)。 73 // のgetHeight(N) 74 // のための(I = 0 int型; ++ I; iが<= N)COUT << SA [I] <<」「; COUT << ENDL。// 含末尾加的字符 75 のための(int型 I = 1を COUT << SA [I] + ++ I; iが<= N)1 << ' ' ; COUT << ENDL。// 不含末尾加的字符 76 // のための(INT i = 0; iがn <; ++ I)COUT << RA [I] <<」「; COUT << ENDL。 77 // のための(I = 2をint型; ++ I; iが<= N)COUT <<高さ[I] <<」「; COUT << ENDL。