フェイス質問
https://www.luogu.org/problem/P4070
問題の解決策
#include <cstdioを> する#include <iostreamの> する#include <CStringの> する#include <ベクトル> の#include <地図> の#define RI INTレジスタ の#define N 100050を 使用して、 名前空間STDを、 int型のn; INT [N]。 構造体SAM { int型 FF [N << 1 ]、LEN [N << 1 ]。 地図 < INT、INT > CH [N << 1 ]。 int型ラス、TOTを。 長い 長いRET; 無効のinit(){ ラスを= TOT = 1 。 RET = 0 ; } ボイドが伸びる(int型C){ int型の NP = ++ TOT、P =ラス。ラス= NP。 LEN [NP] = LEN [P] + 1 。 一方、(!P && CH [P] [C])CH [P] [C] = NP、Pの=のFF [P]。 もし(!p)はFF [NP]は= 1 ; 他{ INT Q = CH [P]、[C]。 もし(LEN [Q] == lenの[P] + 1)FF [NP] = Q。 他の{ int型 NQ = ++ TOT; CH [NQ]= CH [Q]。FF [NQ] =のFF [Q]。 LEN [NQ] = LEN [P] + 1。RET + =(LEN [NQ] - LEN [NQ] FF])。 RET - =(LEN [Q] - LEN [FF [Q])。 FF [NP] = FFの[Q] = NQ。 RET + =(LEN [Q] - LEN [FF [Q])。 一方、(P && CH [P] [C] == Q)CH [P] [C] = NQ、P = FF [P]。 } } RET + = LEN [NP] - LEN [FF [NP]。 } } SAM。 INT メイン(){ scanf関数(" %のD "、&N) 用(RI I = 1のscanfを(; I <= n iは++)" %dの"&[I]); sam.init(); のための(RI i = 1 ; iが++; iが<= N ){ sam.extend([I]); のprintf(" %のLLDを\ n " 、SAM。 RET); } }