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