効果の件名: | 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を返します。 }