羅区P3804サフィックスオートマトンエントリのタイトル

 

最初のピットを残して、ボードを掲示

#include <ビット/ STDC ++ H> 
の#defineが長い長いっ
の#define IOのIOS :: sync_with_stdio(偽); cin.tie(0); cout.tie(0)
の#define担当者(II、B)(のためのII int型=; II <= B; ++ II)
、II(あたりの#define a、b)は(int型II = Bのためにと、ii> =; - ⅱ)
名前空間stdを使用して; //ヘッド
のconst int型MAXN = 2E6 + 10、MAXM = 27 + 10。
int型CASN、N、M、K。
名前空間SAM { 
INT FA [MAXN << 1]、息子[MAXN << 1] [MAXM]、LEN [MAXN << 1]。
INT最後、CNT、T [MAXN]、ヴァル[MAXN]、NUM [MAXN]、[MAXN]。
  ボイド挿入(int型のCH){ 
    int型のPOS =最後に、NPOなど= ++ CNT。
    最後=用のNPO、lenの【のNPO] = LEN [POS] +1。
    (!; POS &&息子[POS] [CH]; POS = FA [POS])息子[POS] [CH] = NPOのための; 
    もしFA [NPO法人] = 1(POS!)。
    他{ 
      INT Q =息子[POS] [CH]。
      (LEN [POS] + 1 == LEN [Q])FA [NPOなど] = Qであれば、
      他{ 
        INT NQ = ++ CNT; LEN [NQ = LEN [POS] +1。
        memcpy(息子[NQ]、息子[Q]、はsizeof(息子[Q]))。
        FA [NQ = FA [Q]; FA [Q] = FA [NPOなど] = NQ。
        用(;息子[POS] [CH] == Q; POS = FA [POS])息子[POS] [CH] = NQ。
      } 
    } 
    ヴァル[NPOなど] = 1。
  } 
  ボイドmakesam(CHAR *は、INT LEN){ 
    最後= CNT = 1;担当者(I、1、LEN)を挿入(S [I] - [A '); 
  } 
  LL getans(){ 
    LL ANS = 0。
    担当者(I、1、CNT)++ NUM [LEN [I]]。
    担当者(I、1、CNT)NUM [I] + = NUM [I-1]; 
    担当者(I、1、CNT)[NUM [LEN [I]] - ] = I。
    あたり(I、1、CNT){ 
      int型のPOS = [I];ヴァル[FA [POS] + = valの[POS]。
      IF(ヴァル[POS]> 1)ANS = MAX(ANS、1LL *ヴァル[POS] * lenの[POS])。
    } 
    戻りANS。
  } 
}
チャーS [MAXN]。
INT {main()のIO。
  CIN >>(S + 1); N = STRLEN(S + 1)。
  SAM :: makesam(S、N)。
  coutの<< SAM :: getans()<<てendl; 
}

 

おすすめ

転載: www.cnblogs.com/nervendnig/p/11518234.html