poj3729接尾辞配列[]

また、この問題は、ホワイトペーパーから次第です。

ポータルます。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 + 110000 + 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ものです。

 

おすすめ

転載: www.cnblogs.com/xiaobuxie/p/11330849.html
おすすめ