BZOJ 2342:[Shoi2011]パリンドロームパリンドロームダブルオートマトン

回文自動機を確立し、その後、回文のようなツリーの外観を横断バレルを開きます。 

コード:

書式#include <cstdioを>   
書式#include <ベクトル>
書式#include <文字列>
書式#include <CStringの>    
書式#include <アルゴリズム>  
#define N 500007    
名前空間stdを使用。   
チャーS [N]。  
年、すべての最後のn個のint型。  
ベクター<INT> G [N]。  
INT CH [N] [26]、ウール[N]、あらかじめ[N]、SS [N]、BU [N]。  
lenのnewNode INT(INT X){リターン[全++] = X、すべて; }    
空の初期化() 
{
    呼ぶ[0] = 1、[1] =  -  1、TOT = 1、PP [0] =  -  1。   
    以下のために(INT I 1 =; I <= N; ++ I)SS [I] = S [i]が ' - '; 
}        
int型getfail(int型P、I int型) 
{
    (!SS [I-lenを[P] -1] = SS [i])とP =プレ[P]一方、 
    Pを返します。      
}                    
無効(I int型、int型のC)を拡張 
{  
    int型のp = getfail(最後、I);    
    (もし!CH [P] [C]) 
    {      
        INT Q = newnode(LEN [P] +2)。   
        プレ[Q] = CH [getfail(プレ[P]、I)] [C]。        
        CH [P]、[C] = Q。   
    }
    最後= CH [P]、[C]。  
}
ボイドsetIO(文字列s){freopenは((S +)c_str()、 "R " STDIN" です。"); }     
無効DFS(int型U) 
{ 
    [lenは[彼]] ++;    
    IF((LEN [U]%4 == 0)&& BU [lenの[U] / 2])ANS = MAX(ANS、LEN [U])。   
    以下のために(; I <G [U] .size(); INT iが0 = ++ I)DFS(G [U] [I])。    
    --bu [lenの[それ]。   
}
メインint型() 
{  
    // setIO( "入力");  
    私は、jはint型。  
    scanf関数( "%D%s" は、&N、S + 1)。     
    初期化(); 
    以下のための(iは= 1; I <= N; ++ i)から(SS [i]は、I)伸びます。 
    以下のために(I 2 =、iは<= TOT; ++ I)G [プレ[I]一back(I)。     
    DFS(0)。           
    printf( "%dの\ n" は、ANS)。           
    0を返します。 
}

  

おすすめ

転載: www.cnblogs.com/guangheli/p/12131366.html