poj1961(KMPアルゴリズムアプリケーションの次の配列)

トピックリンクします。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 
}

 

おすすめ

転載: www.cnblogs.com/FrankChen831X/p/11785429.html