回文自動機を確立し、その後、回文のようなツリーの外観を横断バレルを開きます。
コード:
書式#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を返します。 }