また、この問題は、ホワイトペーパーから次第です。
ポータルます。https://vjudge.net/problem/POJ-3729
質問の意味:あなたを与えるために、B列、あなたは文字列を見つけるためには、kに等しく、すべての共通のプレフィックス番号の接尾辞接尾辞aとbの文字列の最大長さを有しています。
参考ます。https://blog.csdn.net/lj94093/article/details/44703723
実際には、この質問は言っていくつかあります。
それがない理由1、従来の練習の接尾辞配列、すべて一緒に特殊文字を持つ2つの列は、このトピックと数がゼロであってもよいし、手動で1になるよう、0は知りません。。。
図2は、共通のプレフィックスの長さbがNUM(最大値> = K)-numに変換される最大Kに等しい(最大値> = K + 1)。このような変換、それは何を使用ですか?B> = kの接尾辞で私を満たすために接尾辞である> = kの最大値は、カウントすることができます。
3、特定のコードが表示されて、理解するためのコードを見てみましょう。配列は、いくつかのセクションに分かれてk個の時間時間未満我々配列、想像し、同じ段落で、hは> = K、そして私たちは、この段落にシーケンスbを持っている場合は、すべてこの段落の文字列であります満足して> =あなたが会うを持つことができるので、それをKです。
図4は、分析の第3条では唯一のラフ分析、少し詳細で、詳細は接尾辞配列の問題がしばしば遭遇行うことhである(実際には、高さのオンライン配列)iとjの最大の共通のプレフィックスになるように、レコードの配列を意味しますHに対する長さH [I + 1] [J]。つまり、左と開閉する権利です。なお、H [I-1]にはiが<K、その場合、k個以上である、我々は、I-1を見てJ hにこの段落で添加されます。最初のものを忘れないでください。その後、掃引過去に遭遇してきたH <Kの更新表情。
コードに愛さ。
1の#include <iostreamの> 2の#include <cstdioを> 3 使用して 名前空間STDを、 4のtypedef 長い 長LL。 5 のconst int型 N = 100000 + 9 。 6 INT S [N]、RNK [N]、SA [N]、H [N]、T [N]、T2 [N]、C [N]。 7 ボイド get_sa(int型のn、int型M){ 8 INT Yは= * * X = T、T2と、 9 のために(int型 i = 0 ; iがmを<; ++ I)のC [I] = 0 ; 10 のために(int型 i = 0 ; iがn <; ++ I)C ++の[X [I] =のS [I]]。 11 のために(int型 I = 1を C [I] + = C [1-; iが<M ++ I)1 ]。 12 のために(int型 I = N- 1、I> = 0 ; - I)のSA [ - C [X [I]]] = I。 13 のための(int型のk = 1 ; K <= N; kは<< = 1 ){ 14 のint、P = 0 。 15 のためには、(int型 I =のNKを、iがn <; ++ I)Y [P ++] = I。 16 のための(int型 I = 0;私は<N; ++ i)があれば(SA [I] -k> = 0)Y [P ++] =のSA [I] - kは、 17 のためには、(int型 i = 0 ; iがmを<; ++ I)のC [I] = 0 ; 18 のためには、(int型私= 0 ; iがn <; ++ I)++ C [X [Y [I]]]。 19 のために(int型 I = 1を C [I] + = C [1-; iが<M ++ I)1 ]。 20 のためには、(int型 I = N- 1、I> = 0 ; - I)のSA [ - Cの[X [Y [I]]]] = Y [i]は、 21 スワップ(X、Y) 22 、P = 1 ; X [SA [0 ] = 0 ; 23 のためには、(int型 i = 1 ; iがn <; ++ I)X [SAの[I] =(Y [SA [I- 1 ]] == Y [SA [i]は] && Y [SA [I] + K] == Y [SA [I- 1 ] + K])p?1:P ++ 。 24 もし(P> = N)、ブレーク。 25 、M = P。 26 } 27 } 28 空隙 get_h(int型N){ 29 のための(int型 i = 0 ; iがn <; ++ I)RNK [SA [I] = I。 30 のint、K = 0 。 31 用(int型 iは= 0 ; iがN <++ {i)が 32 であれば - (k)は、k個 33 であれば(RNK [I] == 0 ){ 34 、K = 0 。 35 続け; 36 } 37 INT J = SA [RNK [I] - 1 ]。 38 一方、(S [I + K] == S [J + K])++ 、K。 39 時間[RNK [I] = K。 40 } 41 } 42 11(解決int型 K、INT nは、INT {L1)を 43 LL ANS = 0 。 44 のint A = 0 。 45 ブール B = 0 。 46 であれば(SA [ 0 ] <L1)++ ; 47 であれば(SA [ 0 ]> L1)、B = 1 。 48 のために(int型 I = 1 ; <; ++ N Iは{I)が 49 であれば(H [i]は=> K){ 50 なら ++(SA [I] <L1) 。 51 であれば(SA [I]> L1)、B = 1 。 52 } 53 他{ 54 であれば(B)ANS + = A。 55 A = B = 0 。 56 もし ++(SA [I] <L1) 。 57 であれば(SA [I]> L1)、B = 1 。 58 } 59 } 60の リターンANS。 61 } 62 INT メイン(){ 63 のint N、M、K。 64 一方(〜のscanf(" %D%D%D "、&N、&M&K)){ 65 のためには、(int型、I = 0 ; iがN <; ++ i)が{ 66 scanf関数(" %のD "、&S [I])。 67の ++ S [i]は、 68 } 69の S [N] = 10000 + 7 。 70 のために(int型 I = N + 1 ; iが+ N < 1 + mで; ++ i)が{ 71 のscanf(" %dの"、&S [I])。 72の ++ S [i]は、 73 } 74 get_sa(N + M + 1、10000 + 8 )。 75 get_h(N + M + 1 )。 76 のprintf(" %LLDする\ n "、(解決K、N + M + 1、N)-solve(K + 1、N + M + 1 、N))。 77 } 78 リターン 0 。 79 }
EMMオンラインその後、順位がn aに0となり、0 str内なぜ最後の充填を知りません。。。。。。私の考えは、テンプレートにできるだけ近いので、つまり、それは国境の良好な制御のように感じているので、それは、最終的にSTR 0をすることはありません、N-1にRNKとSA 0ものです。。。。