タイトル説明
文字列は小文字の有限シーケンスであり、具体的には、空の配列はまた、文字列であってもよいです。文字列 Pは 文字列である 場合にのみ接頭文字列が存在する B、ように A = PB 。場合 Pは!= Aと Pが 空の文字列ではありません、我々はと言う Pが ある 適切な接頭辞。
定義 Qは、 Aは、場合にのみ期間 Qが あり 、適切な接頭辞と Aが ある Q + Qの プレフィックス(接頭辞適切に持っていません)。このような文字列として や 文字列のある サイクル。文字列の 最大期間は、その最長期間または空の文字列では(場合 Aは、時間ではない)、例えば、 最大期間です 。文字列 の最大のサイクルは、空の文字列です。abab
ababab
abababa
ababab
abab
abc
文字列が与えられると、最大期間は、すべてのプレフィクスの長さの合計が得られます。
入力形式
最初の行の整数 K Kは、文字列の長さを示します。
次の行は、与えられた文字列を示します。
出力フォーマット
これは、すべてのプレフィクスの最大整数期間の長さを出力します。
サンプル
サンプル入力
8
babababa
サンプル出力
24
データ範囲とヒント
すべてのデータに対して、1 <K <10 ^ 6
質問の意味を説明します。
サンプルの実行は再び、最大周期babababaに対応するプレフィックスは00224466をはい長
あなたは自分のYYを読んでいない場合は私が見ていました。
自身が空の文字列にすることはできませんためBABABAを取り、その最大期間馬場ではありません。
文字列= len-最小プレフィックス==接尾辞(null以外の)長さの最大周期長である素晴らしいホテルを簡単に見つけることができます。
証明;
文字列のA1、A2、A3 ......午前のセットは、それが最小のnull以外の接頭辞接尾語長nに等しく、
サイクルとして、A1〜(Mn)を取ることは明らかです。(M-N + 1)〜(M)= A1〜(定義)ので、〜AMはA1〜AN + A1〜、接頭辞であるA1ので。
これは明らかに最大周期(N最小、MNの最大値)です。
この質問はとても簡単ですが、そこにタイムアウトする可能性があることに注意します。ここでDPが使用すると考えられています。DP [i]は明らかにDP、I ==サフィックスプレフィックス長を終了最小プレフィックスで発現[I] DP [NXT [I](NXT [i]が最大プレフィックス長サフィックスを=)を=。
このKeが行わ。
書式#include <iostreamの> 使用して 名前空間はstdを、 長い 長いK、L。 長い 長い F [ 1000100 ]。 長い 長い NXT [ 1000100 ]、ANS。 チャー S [ 1000100 ]。 INT メイン(){ // freopenは( "test.in"、 "R"、STDIN)。 cinを>> K; scanf関数(" %sの"、S + 1 )。 以下のための(長い 長い I = 2、J = 0 ; iは= Kを<; Iは++ ){ 一方(J && S [J + 1!] = sの[I])J = NXT [J]。 もし(S [I] == S [j + 1 ])J ++ 。 NXT [I] = jは、 } のために(長い 長い I = 2 ; iは= Kを<; iは++ ){ F [I] = F [NXT [I]]。 もし([I] == F 0!&& NXT [I] = 0 ){ 長い 長 L = [I] NXT もし(1- == 0)続けます。 一方、{(NXT [L]) L= NXT [L]。 } F [I] = L。 } そうで あれば(F [I] == 0 ){ 続けます。 } 年 + = I - 、F [i]は、 } Coutを << 年。 リターン 0 ; }