POJ_1961

期間
時間制限: 3000MS   メモリ制限: 30000K
合計提出: 19817   受け入れ: 9640

説明

N文字(各文字が97と126の間でASCIIコードを持っている、包括的)で指定された文字列Sの各プレフィックスのために、我々は接頭辞が定期的に文字列であるかどうかを知りたいです。すなわち、長さSの接頭辞iはAのように書くことができるように各I(2 <= I <= N)のために、我々は(一方が存在する場合)> 1最大Kを知りたい、ある K A連結され、 K時間は、もちろんいくつかの文字列Aに、我々はまた、期間Kを知りたいです

入力

入力はいくつかのテストケースで構成されています。各テストケースは、二つのラインで構成されています。最初のものはN(2 <= N <= 1 000 000)を含む-ストリングS.The二行目の大きさは、ストリングSを有するラインを有する入力ファイルが終了すると、含まれて
その上に数ゼロ。

出力

各テストケースは、出力「テストケース番号」と一行に連続テストケース番号の、次に、長さの各プレフィックスの期間K> 1を有するI、出力プレフィックスサイズi及びKは、単一のスペースで区切られた期間。プレフィックスサイズは昇順でなければなりません。各テストケースの後に空白行を印刷します。

サンプル入力

3によって
AAA 
12 
Aabaabaabaab 
0

サンプル出力

ケース#1をテストします。
2 2 
3 3。

テストケース#2 
2 2 
6 2。
9 3。
12である4つの。



参照兄のブログ:次のアレイのシンプルなアプリケーション、http://www.cnblogs.com/jackge/archive/2013/ 01/05 / 2846006.html
詳細な説明とKMPアルゴリズムます。https://blog.csdn.net/v_july_v/article/details/7041827は

コードを書いたギャングのブログを見て:
する#include <stdio.hの> 

INT次に[1000005]は、
INT GET_NEXT(N-INT、チャーSTR []){ 
	int型I = 0、Jは、= -1; 
	次に[0] = - 1; 
	//適切にリサイクルされていない場合試合をしたSTR J =次の[j]は
	次@すなわち最新正しいjへ最後のマッチ
	の消費低減することができる// KMPアルゴリズム、
	一方、(I <N-){ 
		IF(j == - 1 || STR [I] == STR [J]){ 
			I ++、
			J ++、
			次に[I] = J; 
		}そうでなければ{ 
			J =次に[J]; 
		} 
	} 
} 
int型のmain(){ 
	int型I、長さ、K = 。1; 
	INT TEMP; 
	CHAR STR [1000005]; 
	int型COUNT = 1; 
	一方(scanfの( "%のD"、および長さ)&&長){ 
		scanfの( "%のS"、STR); 
		GET_NEXT(長さ、STR); 
		のprintf( "ケース#1%のDテスト「\ N-、COUNT) 
		COUNT ++;
		ため(I = 1; I <=長さ、I ++){
			TEMP = I-次に[I]; 
			// TEMP最短サイクル区間長
			(I%でのTEMP == 0 && I / TEMP> 1)IF 
				のprintf( "%D%D \ N-"、I、I / TEMP); 
			/ / Iの%temp == 0弦部の最小サイクル長は割り切れなければならないので、
			//も分割する必要が
		} 
		のprintf(「\ N-」); 
	} 
	戻り0; 
}

 

おすすめ

転載: www.cnblogs.com/Cl0ud/p/11872072.html