魔法のネックレス
|
問題の説明
母の日は彼女に特別なネックレスを与えるために、少しHの準備ができて来ています。
この文字列は小文字各色を表し、小文字とネックレスとして見ることができます。
このネックレスを作るために、小さなHは、二つのマシンを購入しました。
パリンドローム配列のすべての形態を生成することができる第一マシンが、第二の機械は、二つのパリンドローム配列、および特殊性がある第二のマシンに接続することができる:
もし接尾文字列と文字列のプレフィックスは、これは部分的に重複繰り返すことができる、まったく同じです。たとえば、次の接続ABAとACA、文字列がabaacaまたはアバカを生成することができます。
今の目標スタイルのネックレス与え、あなたはこの特別なネックレスを生成するために、何回第二のマシンに依頼する必要があります。
入力形式
どのように入力されたデータライン、各ターゲットのネックレスのスタイルを表す文字列。
出力フォーマット
複数の行は、各ラインは、第二の機械への回答の最小数が必要とされる表します。
サンプル入力1
abcdcba
abacada
ABCDEF
サンプル出力1
0
2
5
サンプル入力2
xuqeytcixfzpzvcacymqncdohedfyowmipplplkyrsaspjliczflordhlbckyiuqxkslntofajs
amjmaekzbnbwagotspirvjksendltyeeuswefpdcdmmhzomlvkrhtwidlybkvvvebqkmvednaxddeygghrvqfaxwjssvcphcrzeauwlowwdmhacpzbnihgmbypfsblvsyaugkcg
サンプル出力2
65
118
プロンプト
各テストデータ入力5つの未満行
各行の文字列の長さは50000以下であります
1.パリンドロームストリングを通して全て描かカートを識別し、部分文字列のセグメントとみなすパリンドロームの各
質問2が最小になるが、全体の線分、すなわち、最小間隔カバレッジの問題をカバーする範囲から選択されます。欲をすることができます。
する#include <stdio.hに> する#include <ビット/ STDC ++ H.> 使用して 名前空間STD; CHAR S [ 100010 ]; INT LEN [ 100010 ]; // パリンドローム配列長 INT N-、 構造体ノード { int型のL、R&LT; } [ 100010 ]; BOOL CMP(ノードA、ノードB)// 左端貪欲順序 { 戻りアル< BLを; } 無効初期化を() { 用(INT I = N-; I> = 1 ; i-- ) { S [I <<1 ] =のS [i]は、 S [I << 1 | 1 ] = ' &' 。 } N = N << 1 | 1 ; S [ 0 ] = ' %' 。 S [ 1 ] = ' &' 。 S [N + 1 ] = ' ^ ' 。 } ボイドmanacher() { int型 maxright = 0、NUM = 0 。 以下のための(int型 I = 1 ; I <= N。I ++ ) { 場合(iは< maxright) LEN [I] =分(LEN [NUM * 2 -i]、maxright- I)。 それ以外 でlen [i]は = 1 ; 一方、(Sは== S [1- [I [i]は、LENを+] LEN [I]]) { LEN [I] ++ ; } 場合(maxrightは<私は+ lenが[I]) { maxright = iが+ LENを[I]。 NUM = I; } } } int型のmain() { 一方(scanfの(" %S "、S + 1。)EOFを=!)// オペレータ以内に開始 { N-(Sの+ = STRLEN 1。); 初期化(); manacher(); のための(int型私は= 。1 ; I <= N; iは++ ) { [I] .L = I-LEN [I] + 1 ; // 長さに私は左の中心である [I] = I [i]は.Rをlenの+ - 1。 ; // iは正しい長さの中央における } ソート( + 1、+ 1 +N、CMP)。 INT R = 0、ANS = 0、I = 1 。 一方(iは= < N) { int型の和= 0 。 一方、([I] .l- 1 <= R && iは= < N) { 合計 = MAX(和、[I] .R)。 I ++ ; } ANS ++。// 现长 R =合計。// 覆盖完全 場合(R == N) { 破ります。 } // 歳++; } Coutの << years- 1 << ENDL。 } }