[羅区P2375] [NOI2014]動物園

効果の件名: | S | ^ \のleqslant10、[i]は$文字列$ num個のすべての$ S $を見つけるまで$ 5 $グループは$、尋ね

$を$ S_として定義されている$民[i]が{1、I} $の長さは$ \のlfloorの\ dfrac I2を\ rfloor $ $ A $境界の数を超えません

解決策:同様の$ KMPの$。私は、元の$ボーダー$でなければなりません$ボーダー$ $ボーダー$文字列の文字列を見つけ、そしてそれぞれが、その後、最長$ボーダー$の場合$ボーダー$のすべてがに列挙されます。注文する$ RES [i]は$は$ $ $ 1 + $番号{I 1、} $境界$ S_を表す(すなわち、$ S_ {1、I} $を含む$ S_ {1、iは} $である場合すべての$ I \ leqslant \ lfloor \ dfrac満たすために$ S_ {1、J} $ aと$ I $ $ $国境最大、$ NUM [J] = RES [$は$配列はシーク$ NXTの$の配列を渡す時に取得することができresは。今すぐに私が$ jは$から$ $見つけることです。同様にKMP法による$ $は、対応する$ $ I $ J $を取得するために、$ jの+は$ 1には、$ Iは、if $ I> \ lfloor \ dfrac J2、修正するために直接$$ [i]は$条件まで、$ I = NXTを繰り返しました。そのような複雑さおよび$はKMP $ $ O(N)$のと同じです

カードのポイント:なし

 

C ++コード:

#include <cstdioを> 
する#include <CStringの> 
する#include <アルゴリズム> 
の#include <iostreamの> 
CONST INT MAXN = 1E6 + 10、MOD = 1E9 + 7。

INTティム、nは、ANS; 
チャーS [MAXN]。
int型のNXT [MAXN]、RES [MAXN]。
INTメイン(){ 
	のstd :: IOS :: sync_with_stdio(偽)のstd :: cin.tie(0)、STD :: cout.tie(0)。
	std :: cinを>>ティム。
	一方、(ティム- > 0){ 
		のstd :: CIN >> S + 1。
		N = STRLEN(S + 1)、ANS = 1。
		RES [1] = 1。
		(私がj = 0、2 = int型++ I; iが<= N)のために{ 
			ながら(!J && S [I] = S [J + 1])J = NXT [J]。
			NXT [i]は= J + = S [I] == S [J + 1]、RES [I] =のRES [J] + 1。
		} 
		(j = 0、I = 2をint型、iが<= N; I ++)のために{
			(!J && S [I] = S [J + 1])J = NXT [J]一方、
			一方、(J> I / 2)J = NXT [J]。
			ANS = static_castを<長い長>(RES [J] + 1)* ANS%MOD。
		} 
		のstd :: coutの<< ANS << '\ n'を。
	} 
	0を返します。
}

  

おすすめ

転載: www.cnblogs.com/Memory-of-winter/p/11305425.html