[BZOJ2946&SPOJ1812]パブリック文字列(サフィックスオートマトン)

問題の意味:いくつかの小文字からなる言葉与えられ、彼らは文字列の最長共通部分列の長さを見つけます。

単語数<= 5、最も2000少なくとも1のワード長、。

アイデア:

 

 

  1つの#include <ビット/ STDC ++ H>
   2  使用して 名前空間STDを、
  3 typedefの長い 長いLL。
  4符号なしのtypedef int型 のuint ;
  5 typedefの符号なしの長い 長いULL。
  6のtypedef対< INTINT > 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 ] = { - 1100 }。
31        のint DY [ 4 ] = { 00、 - 11 }。
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 = - 1C = 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 }

 

おすすめ

転載: www.cnblogs.com/myx12345/p/11460387.html