プレフィックスと(狼とバイソン)

多くの動物に中央ヨーロッパハーシュフェルデンゲームリザーブ家、ときに互いにせずに長い時間のようなバイソンとオオカミの数は、非侵略の平和と静かな、雄大なバイソン、オオカミと激しいとの間のバランスを保つために事、しかし限り、過半数でバイソンの数が、彼らは他の場所でオオカミに追放されながらオオカミオオカミの数は、バイソンの群れ以上に攻撃するよう。

文字列Sとして表され、0と1が配布牛やオオカミへのローカル統計学者は、Sの文字列は、あなたの文字列の統計によると、一つの領域に牛やオオカミの合計数を表すことができ、彼らにこの保護を判断します地方を頭までは群れ、バイソンやオオカミを共存させることができ、地域のオオカミの合計数です。

エントリー

唯一の01を含む文字列ではなく、より多くの1,000,000以上の長さ。

輸出

0に等しく、長さ1のサブストリングの最大数整数を裏打ち。

サンプル入力のコピー

1011

サンプル出力のコピー

2

プロンプト

1.サンプルの説明
1011のために関しては、以下のように、それは、保護区域の分布を示している:[OX、オオカミ、牛、乳牛]
→[ウルフ、牛]の唯一最大これら2匹の動物は、特定の領域に存在するので、結果は2
2.データの範囲は
、データの10%を文字列の長さ≦10;
100%のデータ、文字列の長さ≤1000000。
 
トピック効果:文字列が最も長い文字列を検索することである(文字列が出会う01に等しいです)
解像度:

0 として -1 1 として +1 、その後、サブストリング(セクション)に場合にのみ数値の和を選択されてもよい 0 セクションと表で

二つの差動にプレフィックス、及び2つのプレフィックスの差 0 すなわち、2つのプレフィックスは等しく、接頭記録する X 最も早い位置を

F [x]は

接頭辞とするために S [i]は、もし F [S [i]は< I サブセクション F [S [I]] + 1 番目の文字のi 文字の文字列が有効なソリューションであり、それよりも短いです

ソリューションは答えには含まれません、あなたはこの長さにあなたの答えを更新することができます

そして0は、プレフィックス、またはプレフィックスを見つけることです、と同等のものを挟みます。(3 ...... ...... ...... 3)は、2つの中間体3、または(...... ...... 0)0以上があります。

ACコード1]とタグプレフィックス融点を有します)

 

#pragma GCCの最適化(2)
の#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
インラインint型リード(){ int型のx = 0、F = 1チャー C = GETCHAR()。一方、(C =!' - ' &&(C < ' 0 ' || C> ' 9 '))C = GETCHAR()。もし(C == ' - ')、F = - 1、C = GETCHAR()。一方、(C> = ' 0 ' && C <= ' 9 '10 + C- ' 0 '、C = GETCHAR()。リターン F * X;} 
のtypedef 長い LL。
const  int型 MAXN = 1E7 + 100 チャー【MAXN]。
int型の合計[MAXN]。
unordered_map < int型int型 > 融点;
int型)(主
{ 
    取得( + 1 )。
    INT、T = STRLEN(+ 1 )。
    以下のためにINT iが= 1 ; I <= T; I ++ ){
         場合(A [I] == ' 0 ' ){ 
            SUM [I] = SUM [I- 1 ] - 1 ; 
        } 
        IF(A [I] == ' 1 ' ){ 
            SUM [I] = SUM [I- 。1 ] + 1 ; 
        } 
    } 
    int型 ANS = 0 ;
     のためのINT I = 1 ; I <= T; I ++ ){
         IF(SUM [I] =!0 &&!mp.count(SUM [I])){ 
            MP [和[I] = I; //ので、最大の和を見つけるためするの最初の発生であるように[I] 
        }
        他の
        ANS = MAX(ANS、I- MP [合計[I]]); 
    } 
    のprintf(" %dの" 、ANS)。 
    リターン 0 ; 
}

 

ACコード2:配列タグ:

#pragma GCCの最適化(2)
の#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
インラインint型リード(){ int型のx = 0、F = 1チャー C = GETCHAR()。一方、(C =!' - ' &&(C < ' 0 ' || C> ' 9 '))C = GETCHAR()。もし(C == ' - ')、F = - 1、C = GETCHAR()。一方、(C> = ' 0 ' && C <= ' 9 '10 + C- ' 0 '、C = GETCHAR()。リターン F * X;} 
のtypedef 長い LL。
const  int型 MAXN = 1E7 + 10 チャー【MAXN]。
int型VIS [MAXN]。
INT メイン()
{ 
    scanf関数(" %S "、+ 1 )。
    INT、T = STRLEN(+ 1 )。
    int型の合計= 0 ;
    int型 ANS = 0 ; 
    合計 = T; 
    以下のためのINT iは= 1 ; iが<= T; I ++ ){
         場合([I] == ' 0 ' ){ 
            合計 - 
        } 
        もし([I] == ' 1 ' ){ 
            合計 ++ 
        }    
        もし(合計= T && VIS [和] ==!0 ){ 
            VIS [和] = I。
        } 
        { 
            ANS = MAX(I- VIS [和]、ANS)。
        } 
    } 
    のprintf(" %dの\ n " 、ANS)。
    リターン 0 ; 
}

 

 

 

おすすめ

転載: www.cnblogs.com/lipu123/p/12169548.html