サブストリングと配列最長文字列0101の等しい数を求めます

https://ac.nowcoder.com/acm/contest/883/B

まず、第1の位置となる0接頭[i]が合計で発現その後カウント及び1,1、位置となります。

もしそうであれば、出発点からであれば和をサブストリングの条件を満足するように[i]が0の値です。

子供が0点に張られていない場合は、合計として[i]は値が前に発生した限り、2つの値の間の文字列は、必ずしも法律上の文字列です。

例えば:

参照番号:12345 

値:00110

合計:-1 -2 -1 0 -1

I == 4合計は[I] == 0、それは1-5の間の正当なものである、長さ4

和[1] ==和[3] ==和[5] == - 1、そう1の最初の発生の位置は-1、最後の発生が5であるため、5-1の長さであることをここで4 =これは、法的な範囲の部分文字列です。

シーケンスは、非常に単純である2で撮影した0,1数の唯一の最小数が必要です

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
typedefの長い 長い int型LL。
typedefの符号なしの長い 長い int型ULL。
const  int型 INF = 0x3f3f3f3f INTの DIR [ 8 ] [ 2 ] = {{ 10 }、{ 01 }、{ 11 }、{ 1、 - 1 }、{ - 11 }、{ - 1、 - 1 }、 { 0、 -1 }、{ - 10 }}。
#defineパイACOS(-1)
 の#define LS RT << 1つ
 の#defineのRS RT << 1 | 1つ
 の#define ME0(S)のmemset(S、0、はsizeof(S))
 の#define ME1(S)のmemset(S 、1、はsizeof(S))
 の#define MEF(S)のmemset(S、-1、はsizeof(S))
 の#define meinf(S)のmemset(S、INF、はsizeof(S))
 のconst  int型 N = 100005 INTの和[N]、T [N]。
インラインint型リード(){
     チャー C = GETCHAR()。INT X = 0、F = 1 しばらく(C < "0 ' | C> ' 9 '){ もし、(C == ' - ')、F = - 1 ; C = GETCHAR();}
     一方、(C> = ' 0 ' && C <= ' 9 ')、X = X * 10 + C- ' 0 '、C = GETCHAR()。
    リターンのx *のF; 
} 
のLL exgcd(LLのB LL){ 
    場合(Bの== 0を返します
    exgcd(B、 B)。
} 
LL q_pow(LLのB -1,11,11- MOD){ 
    LLのANSS= 1 ;
    一方、(b)は、{
         もし、(B&1)ANSS = ANSS *%のMOD。= A *%のMOD。
        B >> = 1 
    } 
    戻りANSS。
} 
LL q_mul(LLのB -1,11,11- MOD){ 
    LL ANSS = 0 一方、(b)は、{
         もし、(B&1)ANSS =(ANSS + A)%MOD。=(A + A)%MOD。
        B >> = 1 
    } 
    戻りANSS。
} 
INT(主int型 ARGC、CHAR * ARGV [])
{ 
    のstd :: IOS :: sync_with_stdio()。
    int型 N、L2 = 0、Y2 = 0 、ANS2、V [N]。
    MEF(V); 
    チャーS [N]。
    cinを >> N; 
    CIN >> S + 1 ;
    INT LEN = STRLEN(S + 1 )。
    以下のためにint型 i = 1 ; iは= LEN <; iは++ ){
         もし、(S [I] == ' 1 ' ){ 
            T [I] = 1 
            Y2 ++ ; 
        } 
        { 
            Tの[I] = - 1 
            L2 ++ ; 
        } 
    } 
    和[ 1 ] = T [ 1 ]。
    地図 < INTINT > M。
    M [和[ 1 ] = 1 int型 MAXN = 0 ;
    int型 I = 2 ; iがLEN = <I ++は{)
        和[I] =和[I- 1 ] + T [i]は、  //算出合計
        場合(メートル[合計[I] =!0)=最大MAXN(MAXN、IM [合計[I]]); // あまりにも前の合計値が表示された場合、最初の位置の現在位置を引い
        他の M [和[I] = I; // 他合計値のレコードが位置表示
        IF([I]和== 0)=最大MAXN(MAXN、Iは); // 0に上記のもの全てを意味します01に等しい
 //         COUT << SUM [I] << "" << M [SUM [I]] << ENDL; 
    } 
    ANS2 = 2 *(L2> Y2?Y2:L2)、
    COUT << << MAXN "   << ANS2 << ENDL;
     戻り 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/wushengyang/p/11243709.html
おすすめ