[Kuangbinが飛ぶためにあなたを取る] KMP&トピック16が延長KMP&Manacher
G - パワーストリングス
POJ - 2406
トピック:
二つの文字列aとbのを考えると、私たちは彼らの連結する* bを定義します。例えば、= "ABC" とし、B = "DEF" *のB = "ABCDEF" もし。A ^ 0 = ""(空の文字列)と^(N + 1)*は(A ^ n)を=:我々は負でない整数乗算、累乗として連結を考えた場合、通常の方法で定義されています。
入力
各テストケースは、印刷可能文字の文字列sを表す入力のラインです。Sの長さは、少なくとも1であり、そして100万文字を超えることはありません。期間を含む行は、最後のテストケースに従います。
出力
それぞれについてあなたは最大のnように、S = A ^ nは、いくつかの文字列Aのを印刷する必要がありますね。
サンプル入力
ABCDは、 AAAAの ABABAB 。サンプル出力
1 4 3ヒント
この問題は、巨大な入力を持っている、超過時間制限を回避するために、代わりにCINのscanf関数を使用します。
サイクル数が必要な文字列セクション:タイトルの意味
思考:文字列は、注目すべき場合、その出力循環組成の全てではない場合は-1ループ部が構成されている場合、N-nexttこの長さは、サイクルの長さの合計で割ってと[n]はループ部の長さは、あります日長
// // 2019年8月15日にHJYLによって作成されます。 // する#include <iostreamの> の#include <ベクトル> の#include <マップ> 書式#include <文字列> の#include <キュー> の#include <スタック> の#include < セット > の#include <アルゴリズム> 書式#include <cstdioを> する#include < CString> の#include <cmath> の#include <cstdlib> 名前空間stdを使用。 const int型MAXN = 1E7 + 10 。 チャーSTR [MAXN]。 int型nextt [MAXN]。 = 0、J = -1 ; nextt [ 0] = - 1 。 INT、N = STRLEN(STR)。 しながら、式(I < N) { 場合 - (1 || STR [I] == J == STR [J]) { iが ++、J ++を。 もし(!STR [I] = STR [J]) nextt [i]は = jで。 他 nextt [I] = nextt [J]。 } そう J = nextt [J]。 } } メインINT() { //freopenは( "C:\\ユーザー\\ asus567767 \\ CLionProjects \\無題\\テキスト"、 "R"、STDIN); 一方、(〜のscanf("%sの" 、STR)) { 場合(STR [0] == '' ) ブレーク。 INT LEN = STRLEN(STR)。 getnextt(); もし(LEN%(LEN-nextt [LEN])== 0 ) のprintf("%Dを\ n"、LEN /(LEN-nextt [LEN]))。 他 のprintf("1つの\ N" ); } 戻り 0 。 }