トピックリンクします。https://vjudge.net/problem/POJ-1961
問題の意味:ストリングS(1 ... i)が周期的なサブストリングが出力される場合、インデックスi(2 <= iが= Nを<)のために、長さnの文字列、(N <= 1E6)が与えられます最大期間。
アイデア:
定義されたアルゴリズムの調査は、(i + 1)%(IJ)== 0 &&(I + 1)/(IJ)> 1は、条件が満たされた場合、次のマスター配列をKMP場合ストリング。
ACコード:
書式#include <cstdioを> する#include <アルゴリズム> 書式#include <CStringの> 使用して 名前空間はstdを、 const int型 MAXN = 1E6 + 5 。 int型N、CAS、NEX [MAXN]。 チャーS [MAXN]。 空GET_NEXT(){ int型J。 J = NEX [ 0 ] = - 1 。 以下のために(int型 i = 1 ; iは<N; ++ I){ 一方(J> - 1つの!&& S [I] = S [J + 1 ])J = NEX [J]。 もし(S [i]を== S [J + 1 ])++J; NEX [I] = jは、 もし((I + 1)%(IJ)== 0 &&(I + 1)/(IJ)> 1 ) のprintf(" %D%D \ n "、I + 1、(I + 1)/(IJ )) ; } } int型のmain(){ 一方(scanf関数(" %のD "、&n)は、N){ scanf関数(" %sの" 、S); printf(" テストケース#1%d個の\ n "、++ CAS)。 GET_NEXT(); printf(" \ nを" ); } 戻り 0 。 }