呪いのSDOI2016を[生成]

フェイス質問

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 ]。
  地図 < INTINT > 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] + 1RET + =(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); 
  } 
}

 

おすすめ

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