説明
所与 0 との配列A 配列に、図3 のすべてのこれらの部分は、同じバイナリ値を表すように、空でない部分を、。
行われた場合は、いずれかを返す [I、J] 、I + 1 <J。 、この方法:
A [0]、A [1 ]、...、A [i]が第1の部分を構成します。
A [I + 1]、A [I + 2]、...、A [J-1] 第二の部分として;
A [j]は、A [J + 1]、...、A [A.length - 1] 第三の部分です。
3つのバイナリ値が等しい部分が示されています。
あなたがそれを行うことができない場合は、に戻る [-1、-1] 。
各セクションのバイナリ表現を考えるに、それは全体として考慮されなければならないことに留意されたいです。例えば、 [1,1,0]は小数点で表現6 が、ではありません3 。ようさらに、先行ゼロは、許可されている[0,1,1] 及び[1,1]が同じ値を表します。
入力
0と1の文字列のみを入力し
出力
出力は、スペースで区切って、対象のiとjの条件を満たしています
サンプル入力1
1 0 1 0 1
サンプル出力1
0 3
サンプル入力2
1 1 0 1 1
サンプル出力2
-1 -1
ヒント
3 <= A.length <= 30000
A[i] == 0或A[i] == 1
アイデア:
1.まず、文字列1とCNTの数を計算します
それはデジタルビット内の3つの必須セクションが同じでなければならないように、同じで表されるバイナリの三枚を必要とするので、2次の文字列は、3つのセクションに分割されなければならない、即ち同じ3があります進数、この3段のバイナリ番号が同じ番号のうち3つを有することであるので、
従って、CNT%3 == 0(最初の数字1の各部分が同一であることを保証するために)。
3.私たちは、セグメントを知りたいI、Jを求める要求の対象は、それが順次添字ANS1 1の最初の出現、CNT / 3 + 1が表示され、記録三つの異なる変数のための3回のサイクルで洗浄し、 ANS2、CNT / 3 * 2 + 1つの位置の場所はANS3あります。
次に図4及び[ANS1] == A [ANS2] && A [ANS2] == A [ANS3] && ANS <jが決定され、ANS1 ++、ANS2 ++、asn3 ++を使用し、それは同じではないか、最終的に終了するために一度後退したものと同じです
5.出力の回答
コード:
する#include <stdio.hに> する#include < 文字列・H> int型のmain(){ char型 [ 60001 ]。 チャー S [ 30001 ]。 int型 CNT = 0 ; int型 J = 0 ; (A)を取得します。 以下のために(INT iが= 0 ; [I] =!' \ 0 ' ; I ++ ){ 場合([I] == ' 1 ' ) CNT ++ ; もし([I] == ' 1 ' || [I] == ' 0 ' ){ S [J ++] = [i]は、 } } printf(" %sの\ n " 、S)。 S [J] = ' \ 0 ' ; int型 ANS1 = 0 ; int型 ANS2 = 0 ; int型 ANS3 = 0 ; もし(CNT%3!= 0 || CNT == 0 ){ printf(" -1 -1 \ N " ); } 他の{ のためには、(int型は、私は= 0 ; S [i]を=!' \ 0 ' ; I ++ ){ 場合(S [i]を== ' 1 ' ){ ANS1 ++ ; もし(ANS1 == 1 ){ ANS1 = I; 休憩; } } } 以下のために(INT iが= 0 ; S [I] =!' \ 0 ' ; I ++ ){ もし、(S [I] == ' 1 ' ){ ANS2 ++ ; もし(ANS2 == CNT / 3 + 1 ){ ANS2 = I; 休憩; } } } 以下のために(INT iが= 0 ; S [I] =!' \ 0 ' ; I ++ ){ もし、(S [I] == ' 1 ' ){ ANS3 ++ ; もし(ANS3 == CNT / 3 * 2 + 1 ){ ANS3 = I; BREAK ; // 忘れてゲーム } } } 一方、(S [ANS1] == S [ANS2] && S [ANS2] == S [ANS3] && ANS3 < J){ ANS1 ++; ANS2 ++; ANS3 ++ ; } もし(ANS3 == J) printf(" %D%D \ n "、ans1- 1 、ANS2)。 他 のprintf(" -1 -1 \ N " ); } リターン 0 ; }