http://acm.hdu.edu.cn/showproblem.php?pid=1358
期間
問題の説明
N文字(各文字が97と126の間でASCIIコードを持っている、包括的)で指定された文字列Sの各プレフィックスのために、我々は接頭辞が定期的に文字列であるかどうかを知りたいです。すなわちごとに、あるI(2 <= iが= Nを<)、我々は私のように書くことができる長さSのプレフィックスように(もしあれば)最大K> 1を知りたい
Kは
、それが連結されK時間は、もちろんいくつかの文字列Aに、我々はまた、期間Kを知りたいです
入力
入力ファイルは、いくつかのテストケースで構成されています。各テストケースは、二つのラインで構成されています。最初のものはN(2 <= N <= 1 000 000)を含む - ストリングSの大きさは、2行目はSで入力ファイルがその上に数ゼロを有する、線で終わる文字列を含みます。
出力
各テストケースは、出力「テストケース番号」と一行に連続テストケース番号の、次に、各プレフィクスの長さIは、周期K> 1、出力I及び期間Kは、単一のスペースで区切られたプレフィックスのサイズを有します。プレフィックスサイズは昇順でなければなりません。各テストケースの後に空白行を印刷します。
サンプル入力
3 AAA 12 aabaabaabaab 0
サンプル出力
テストケース#1
2 2
3 3
テストケース#2
2 2
6 2
9 3
12 4
推薦します
JGShining
問題の意味:文字列、すべての出力Q:どのくらいの長さ(全体の長さ以下)のは、二つの同一のサブ文字列の最小値から得ることができます
注意:タイトルだけでは最長の接頭辞と接尾辞を求めている、それは次の配列の最適化を実行することが最善ではありません(マッチング問題を使用することができます)
#include <cstdioを> する#include <CStringの> する#include <cmath> の#include <アルゴリズム> の#include <iostreamの> する#include <アルゴリズム> の#include <iostreamの> する#include <cstdioを> する#include < ストリング > の#include <CStringの> 書式#include <stdio.hに> する#include < 文字列の.h> 使用して 名前空間はstdを、 チャー [ 1000009します]。 空 GETNEXT(CHAR *、int型 lenは、次) { 次の[ 0 ] = - 1 。 INT K = - 1、J = 0 。 一方、(J < LEN) { 場合 - (K == 1 || [j]が== [K]) { kは ++ 。 J ++ ; 次の[J] = K。 } 他 { K = 次の[K]。 } } } int型のmain() { int型N-、ANS = 0 ; ながら(〜scanfの(" %のD "、およびN-)を&& N-) { INT次に[ 1000009 ]; scanfの(" %のS " 、A); のprintf(" テストケース#%D \ N- "、 ++ ANS) のmemset(次、0、はsizeof (次)); GetNextの(A、N-、次); // 次の配列を見つける ために(int型 I = 2 ; I <= N; Iは++)// 各々を反復図2は、文字列よりも大きい { //I%I(I -次の[ i])と、文字列が数字で構成されていることを示している(1より大きい)と同じ文字列 IF(次に[I]> = 1。 && I%(I -次に[I])= = 0 ) { int型 L = I - 次に[I]; のprintf(" %D%D \ N- "、I、I / L); // I / Lと同じで構成される文字列の同じ数を見つけます } } printf(" \ N- " ); } の戻り 0 ; }