最初のピットを残して、ボードを掲示
#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; }