期間
時間制限: 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; }