[接尾辞配列] Luogu P3809サフィックスソーティング

タイトル説明

長さ読取  n個の順次元の文字列のサフィックスの最初の文字を出力することにより、ケース文字や数字、この要求によって、その後、大小規模のすべての非空の辞書式順序接尾文字列をn個の文字列を位置インチ 番号付き位置  。1個のN- N-。

 

問題の解決策

  • ボードの質問

 

コード

1の#include <cstdioを>
 2の#include <CStringの>
 3の#include <iostreamの>
 4  の#define N 1000010 
 5  使って 名前空間STD。
6  INTの N、M = 122 、T [N]、X [N]、C [N]、SA [N]。
7  チャーS [N]。
8  ボイドget_SA()
 9  {
 10      のためのint型 i = 1 ; iが<= N; iが++)C [X [I] = sの[I]] ++ ;
11      のためにint型 I = 2 [I] + = C C [I-; I <= M I ++)は1 ]。
12      のためのint型 I = N; I> = 1 ; i--)SA [C [X [I]] - ] = I。
13      のためのint型のk = 1 ; K <= N; kは<< = 1 14      {
 15          のint、P = 0 16          のためにint型 I = N-K + 1、iが<= N; I ++)はT [++ P] = Iと、
17          のためにint型 i = 1 ; iが<= N; iが++)場合(SA [I]> k)はT [++ P] =のSA [I] - kは、
18          のためにint型 I = 1 ; I <= M; iが++)[I] = C 0 19          のためにint型 i = 1 ; iが<= N; iが++)C [Xを[I]] ++ ;
20          のためにint型 I = 2 [I] + = C C [I-; I <= M I ++)は1 ]。
21          のためにint型 I = N; I> = 1 ; i--)SA [C [X [T [I]]] - ] = tの[I]、T [I] = 0 ;
22          スワップ(X、T)。
23          、P = 1、X [SAの[ 1 ] = 1 24          のためにint型 I = 2を X [SA [I] =(T [SA [1-が; iが<= N I ++)は1 ]] == T [SA [I]] && T [SA [I- 1] + K] == T [SA [i]が+ K])P:++ P。 
25          もし(P == N)ブレーク26          、M = P。
27      }
 28      のためのint型 i = 1 ; iが<= N; iが++)のprintf(" %dの" 、SA [I])。
29  }
 30  のint main()の
 31  {
 32      のscanf(" %sの"、S + 1)、N = STRLEN(S + 1 )、get_SA()。    
33 }

 

おすすめ

転載: www.cnblogs.com/Comfortable/p/11258177.html