最長共通部分列を求めるnlog

実際には、2列、Bのためのモデルを転換における重要な嘘は、私たちが取得する(N ^ 2)Oを使用することができます彼らの最長共通部分列を列挙が、その中にいくつかの質問にそうそこに、明確に満たされていませんアルゴリズムのnlog。

まず、我々はシーケンス、B列の各要素の位置を見つける必要があり、これは複数の位置を有していてもよく、それはこの位置にBの要素が存在しないため、降順であろうが、明らかに空集合であるのでBの各要素の位置に複数組であり、単調減少の内部に設定得、そして合わせた要素の複数のセットの順に、得られた、我々は新しいを得ることができ列の数は、最も長いシーケンスは列にこの数を増やすことができます見つけます。

明らかに、アルゴリズムの正しさは、列の数を、各要素は上昇が前面から背面への配列の順序を保証することであるが、新たに得られたa及びbは、共通の要素を有する表します。

ここで重要な点は、位置を探しているときには、このように複数の要素に要素Bに一致を置く可能性を保持し、下降する、配列(B)に格納されています。

羅区テンプレート質問:https://www.luogu.org/problem/P1439

1の#include <cstdioを>
 2の#include <CStringの>
 3の#include <iostreamの>
 4の#include <アルゴリズム>
 5の#include <ベクトル>
 6  使って 名前空間STDを、
7  の#define N 100005
 8  int型リード(){
 9      INT S = 0、F = 1 10      CHAR CH = GETCHAR()。
11      のために(; CH < ' 0 ' || CH> ' 9 ' ; F =(CH == ' - ') - 1:F、CH = GETCHAR())。
12      のために(; CH> = ' 0 ' && CH <= ' 9 ' ; S = sの* 10 +(CH ^ 48)、CH = GETCHAR())。
13      リターン S *のF;
14  }
 15ベクター< INT > Q [N]。
16  int型 N、[N]、B [N]、低[N]、ANS = 1 、ここで[N]。
17  int型の検索(int型、今INT {RR)
 18      のint L = 0、R = RR、ミッド。
19      しばらく(L < R){
 20          半ば=(L + R)>> 1 21          もし R =(今>ロー[中間])ミッド。
22          他の L =ミッド+ 1 ; 
23      } 戻りL。
24  }
 25  INT メイン(){
 26      N = 読み取ります()。
27      のためにint型 i = 1 ; iが<= N; I ++)[I] = 読み取ります();
28      のためには、int型 i = 1 ; iは= N <; ++ I)[I] = B 読み取ります()。
29      のためにint型 I = N; I; -I)Q [B [I]一back(私に)。
30      のためにint型 i = 1 ; iが<= N ++ {I)
 31          場合(qが[i]は]空の())続けます32          のためにINT J = 0 ; J <Q [I]サイズ(); ++ j)は今[++次に[ 0 ] = Q [I]、[J]。
33      }低[ANS] =今[ 1 ]。
34      のためにint型 I = 2 ; iが<今= [ 0 ]; ++ i)が{
 35          場合(ここで、[I]>低[ANS])低[++ ANS = 今[I]。
36          ロー= [(ここで[I]、ANS)検索] [i]は今。
37      } COUT << ANS。
38      リターン 0 ;
39 }
コードの表示

 

おすすめ

転載: www.cnblogs.com/forevergoodboy/p/11666830.html