http://poj.org/problem?id=2752
名声を求め、名前を求めます
制限時間: 2000ミリ秒 | メモリの制限: 65536kも | |
合計提出: 27512 | 受け入れ: 14244 |
説明
小さな猫は、とても有名ですBytelandに丘や谷に比べて多くのカップルが不定期こと、そして彼らの新たに生まれた赤ちゃんに名前を与えるために小さな猫を尋ねました。彼らは名前を追求すると同時に、名声を求めています。そのような退屈な仕事から脱出するためには、革新的な小さな猫は簡単ですが、幻想的なアルゴリズムを動作します:
ステップ1を。新しい文字列Sに、父親の名前と母親の名前を接続します
ステップ2。(接頭辞が、また、Sの接尾辞だけではありません)Sの適切な接頭接尾文字列を検索します。
例:父= 'ALA'、母= 'ラ'、我々は+ 'ラ' = 'alala' 'たala' S =を持っています。Sの電位接頭接尾文字列は{ 'A'、 'ALA'、 'alala'}です。文字列Sを考えると、あなたは小さな猫がSの可能接頭接尾辞の文字列の長さを計算するプログラムを作成するのに役立つだろうか?(彼はあなたの赤ちゃんの名前を与えることによって、あなたに感謝かもしれません:)
ステップ1を。新しい文字列Sに、父親の名前と母親の名前を接続します
ステップ2。(接頭辞が、また、Sの接尾辞だけではありません)Sの適切な接頭接尾文字列を検索します。
例:父= 'ALA'、母= 'ラ'、我々は+ 'ラ' = 'alala' 'たala' S =を持っています。Sの電位接頭接尾文字列は{ 'A'、 'ALA'、 'alala'}です。文字列Sを考えると、あなたは小さな猫がSの可能接頭接尾辞の文字列の長さを計算するプログラムを作成するのに役立つだろうか?(彼はあなたの赤ちゃんの名前を与えることによって、あなたに感謝かもしれません:)
入力
入力は、テストケースの数が含まれています。各テストケースは、Sは、上述した文字列を含む単一の行を占めています。
制限事項:小文字のみを入力して表示されることがあります。1 <= S <= 400000の長さ。
制限事項:小文字のみを入力して表示されることがあります。1 <= S <= 400000の長さ。
出力
各テストケースのために、出力新しい赤ちゃんの名前の可能な長さを表す、昇順の整数番号の一行。
サンプル入力
ababcababababcabab aaaaa
サンプル出力
2 4 9 18 1 2 3 4 5
ソース
POJ月- 2006年1月22日
、朱Zeyuan
質問の意味:文字列すべて同じ接頭辞と接尾辞を探します。
アイデア:私たちはすべての要件場合は、我々は0に次のアレイまで再帰的に転送します、次のアレイは、最長の接頭辞と接尾辞を求めている知っている、あなたはすべての接頭辞と接尾辞の長さを見つけることができます
#include <cstdioを> する#include <CStringの> する#include <cmath> の#include <アルゴリズム> の#include <iostreamの> する#include <アルゴリズム> の#include <iostreamの> する#include <cstdioを> する#include < ストリング > の#include <CStringの> 書式#include <stdio.hに> する#include < 文字列の.h> 使用して 名前空間はstdを、 チャー [ 1000009します]。 int型の次の[ 1000009 ]。 ボイド GETNEXT(CHAR *、INT LEN、INT * 次) { 次の[ 0 ] = - 1 。 INT K = - 1、J = 0 。 一方、(J < LEN) { 場合 - (K == 1 || [k]が== [J]) { kは ++ 。 J ++ ; // (![K] = [J])であれば 、次の[J] = K。// 次の数组不能优化 // 他 // 次の[J] =次の[K]; * / } 他 K = 次の[K]。 } } int型のmain() { ながら(〜のscanf(" %sの" 、A)) { memsetの(次、0、はsizeof (次))。 memset(NUM、0、はsizeof (NUM))。 INT LEN = STRLEN(A)。 GETNEXT(次、LEN)。 INTは L = 0 。 NUM [L ++] =LEN; 一方、(次の[LEN]> 0)// 前方再帰次配列 { NUM [L ++] = [LEN]次に、 LEN = 次の[LEN]; } ための(int型 I = L - 1。 ; I> 0 ; i-- ) { のprintf(" %のD " 、NUM [I]); } のprintf(" %d個の\ N- "、NUM [ 0 ]); } 戻り 0 ; }