問題の意味:いくつかの小文字からなる言葉与えられ、彼らは文字列の最長共通部分列の長さを見つけます。
単語数<= 5、最も2000少なくとも1のワード長、。
アイデア:
1つの#include <ビット/ STDC ++ H> 2 使用して 名前空間STDを、 3 typedefの長い 長いLL。 4符号なしのtypedef int型 のuint ; 5 typedefの符号なしの長い 長いULL。 6のtypedef対< INT、INT > PII。 7のtypedef対<-1,11,11-> PLL。 8 typedefのベクトル< int型 > VI。 9のtypedefベクトル<PII> VII。 10のtypedef対<LL、INT > P。 11 の#define N 4100 12 の#define M 151000 13 の#define Fiの最初の 14 の#define SE第 15 の#define MPがmake_pair 16件 の#defineパイACOSを(-1) 17 の#define MEM(A、B)のmemset(A、B、はsizeof (A)) 18 の#define iは=(INT)B <; I ++)のRep(iについては、B)(I =(INT INT) 19 の#defineため当たり(I、B)(I int型=(INT)A; I> =(INT)B; i--) 20 の#define lowbit(x)は、x&( - X) 21 の#defineランド(RAND()*(1 << 16)+ランド()) 22 の#define ID(X)((X)<= B(X):MN /(X)+1) 23件 の#define LS P << 1 24 の#define RS P << 1 | 1 25 26 のconst int型 MOD = 998244353、INV2 =(MOD + 1)/ 2 。 27 二重 EPS = 1E- 6 。 28 LL INF = 1E18。 29 LL INF = 5E13。 30 int型 DX [ 4 ] = { - 1、1、0、0 }。 31 のint DY [ 4 ] = { 0、0、 - 1、1 }。 32 33 チャーCH [N]。 34 int型 N、I、X、P、Q、NP、NQ、CNT、L、ST [N]、C [N]、[ 26 F]、[N]、POS [N]、BL [N]に[ N] SZ、B [N]、[N]、ANS [N]、LEN [N]。 35 36 のint リード() 37 { 38 INT V = 0、F = 1 。 39 チャー C = GETCHAR()。 40 一方、(C < 48 || 57 <C){ もし、(C == ' - ')、F = - 1。C = GETCHAR();} 41 ながら(48 <= C && C <= 57)V =(V << 3)+ V + V + C- 48、C = GETCHAR()。 42 リターンのV *のF; 43 } 44 45 空隙追加(INT X) 46 { 47 、P = NP。 48 ST [NP = ++ CNT] = ST [P] + 1 。 49 [NP]へ= I。 50台の POS [I] = NP。 51 のために(; P && C [P] [X];!P = F [P])C [P] [X] = NP。 52 もし [NP] = F(P!の)1 。 53 そう であれば(ST [P] + 1 == ST [Q = C [P] [X]])[NP] = F Q。 54 他の 55 { 56 ST [NQ = ++ CNT] = ST [P] + 1 。 57件 のmemcpy(C [NQ]、C [Q]、はsizeof C [Q])。 58 F [NQ] = F [Q]。 59 F [Q] = F [NP] = NQ。 60 のために(; P && C [P] [X] == Q; P = F [P])C [P] [X] = NQ。 61 } 62 } 63 64 65 のint main()の 66 { 67 // freopenは( "1.in"、 "R"、STDIN)。 68 // freopenは( "1.out"、 "W"、STDOUT)。 69 int型 CAS = リード()。 70 、NP = CNT = 1 。 71 のscanf(" %sの" 、CH)。 72 N =のSTRLEN(CH)。 73 担当者(iは0、N- 1)を追加(CH [I] - [ A ' ); 74 担当者(I、1、CNT)ANS [I] = ST [i]は、 75 担当者(I、1、CNT)B [ST [I]] ++ ; 76 担当者(I、1、n)がB [I] + = B [I- 1 ]。 77 担当者(I、1、CNT)BL [B [ST [I]] - ] = I。 78 のための(I = 0、P = 1 SZ [P = C [P] [CH [I] -私は++; iがn <)' ' ]] ++ ; 79 のための(I = CNT; I; i--)SZ [F [BL [I]]] + = SZ [BL [I]]。 80 // 担当者(I、0、N-1)のprintf( "%dの"、SZ [POS [I])。81 担当者(V、1、CAS- 1 ) 82 { 83 のscanf(" %sの" 、CH)。 84 N =のSTRLEN(CH)。 85 担当者(I、1 lenは、CNT)[I] = 0 ; 86 のために(P = 1、I = L = 0 ; iがn <; iは++ ) 87 { 88 INT X = CH [I] - [ A ' 。 89 ながら(!C [P] [X] && P)は、P = F [P]。 90 であれば、P =(P!)1、L = 0 。 91 他 L =分(L、ST [P])+ 1、p個の=のC [P] [X]。 92の LEN [P] = MAX(LEN [P]、L)。 93 } 94 あたり(I、CNT、1)LEN [F [BL [I]]] =MAX(LEN [F [BL [I]]]、LEN [BL I])。 95 担当者(I、1、CNT)ANS [I] = 分(ANS [i]は、LEN [I])。 96 } 97 INTアンス= 0 。 98 担当者(I、1、CNT)アンス= マックス(ANS、ANS [I])。 99 のprintf(" %d個の\ n " 、ANS)。 100 リターン 0 ; 101 }