manacher ---魔法のネックレス

魔法のネックレス

制限時間: - MS    スペースの制限: - KB 
ベンチマークの説明:1秒、64メートル
問題の説明

母の日は彼女に特別なネックレスを与えるために、少し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。
    } 
}

 

おすすめ

転載: www.cnblogs.com/CXYscxy/p/11350159.html