フェイス質問
https://www.luogu.org/problem/P1368
問題の解決策
書式#include <cstdioを> する#include <iostreamの> の#include <CStringの> の#include <マップ> に#define里レジスタint型 の#define N 300050 使用して 名前空間はstdを、 int型のL; 構造体ノード{ int型FF、LEN。 マップ < int型、int型 > CH; } T [N << 2 ]。 INT [N]。 構造体SAM { int型のTOT、ラス。 インラインボイドのinit(){ TOT =ラス= 1 。 } インラインボイド延びる(int型C){ int型、NP = ++ TOT、P =ラス。ラス= TOT; T [NP] .LEN = T [P] + .LEN 1 。 一方、(!P && T [P] [C] .CH)T [P]は[C] = NP、P = .CH T [P] .ffと、 もし(!{P) T [NP] .ff = 1 。 } 他{ INT Q = T [P] .CH [C]。 もし(T [Q] .LEN == T [P] .LEN + 1 ){ T [NP] .ff = Q。 } 他{ INT NQ = ++ TOT。 T [NQ] = tの[Q]。tは[NQ] .LEN = T [P] + .LEN 1 。 T [NP] .ff = T [Q] .ff = NQ。 一方、(Pの&& tの[P] .CH [C] == Q)T [P] .CH [C] = NQ、P = T [P] .ff。 } } } } SAM。 INT メイン(){ sam.init()。 scanf関数(" %のD "、&L)。 用(RI I = 1のscanf(; iが= Lを<I ++)は、 " %のD "、および[I])。 用(RI i = 1 ; iが= Lを<I ++はsam.extend([I]))。 用(RI i = 1 iは= Lを<; I ++ sam.extend([I]))。 int型になりました= 1 ; 用(RI i = 1 ; iが<= Lと、iが++ ){ のprintf(" %dの"、T [今] .ch.begin() - > 最初の); 今 T [今] .ch.begin()= - > 秒。 } }