接尾辞配列の問題セット

サフィックス(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。    
コードの表示

 

おすすめ

転載: www.cnblogs.com/wangzhebufangqi/p/11317446.html
おすすめ