1つの#include <ビット/ STDC ++ H.>
2 の#define 1000010の数Nmax
3。
4。 使用した 名前空間STD;
5 int型C、RK [Nmax個の]、X Y [の数Nmax]、[数Nmaxの】SA、[Nmax個の] [の数Nmax];
6 / / Y最初のキーワードの位置のI [i]が第二キーワード順位番号
7。
8。 チャーS [の数Nmax];
9 int型 N-、K、M = 200である;
10
。11 ボイドのqsort(){
12である ため(int型 I = 1 ; I <= M、Iが++)C [I] = 0 ;
13である ため(INT I = 1; I <= N。I ++)C [X [I]] ++ ;
14 のために(int型 I = 1 [I] + = C C [I-; I <= M I ++)は1 ]。
15 のために(int型 ; I> = I = N 1 = - SA [C [X [Y [I]]]]; i--); Y [i]は
16 }
17
18 INT メイン(){
19 のscanf(" %sの"、S + 1 )。
20 N =のSTRLEN(S + 1 )。
21 のために(int型 i = 1 ; iが<= N; iが++)X [i]は=のS [i]は、
22 のために(INT I = 1。 ;私は<= N-; I ++の)Y [I] = I;
23である のqsort();
24 用の(int型 L = 1。 ; L <N - ; L << = 1 ){
25 INT T = 0 、
26であります 以下のために(int型 I = N-L- + 。1 ; I <= N; I ++)はY [T ++] = I;
27の // いくつかの数字が最初のキーではなく、第2のキーは、いくつかの数字のsaされていない[I ]の範囲カバーすることができる
28 のために(INT I = 1 ; I <= N; I ++)はIF(SA [I]> L)Y [T ++] = SA [I] -1; // 最初に存在する場合キーワード
29 のqsort();
30 M = 1 ;
31である Y [SAの[ 1 ] =のM;
32 用の(int型 I = 2 ; I <= N; Iは++ ){
33は、 // ここfallibility、SA [i]を2リットルの長さを指し、しかしXのみLの長さを意味するので、また第二のキーワードの比較
34である IF(X [SA [I]] == X [SA [I- 1 ]])IF(X [SA [I] + L] = X = [SA [I- 1 ] + L]){Y [SA [I] = mの; 続行;}
35 Y [SA [I] ++ = M;
36 }
37 のための(int型私は= 1 ; I <= N; I ++)X [I] = Yは、[I]は、
38であります }
39 のための(int型 i = 1 ; iが<= N; iが++)のprintf(" %dの" 、SA [I])。
40 リターン 0 ;
41 }