[P1368]羅区プロセス

フェイス質問

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()= - > 秒。
  } 
}

 

おすすめ

転載: www.cnblogs.com/shxnb666/p/11279291.html