タイトル説明
可能な限り、数が0に等しく、1が含まれる0-1の文字列が与えられると、サブストリングを見つけます。
入力
のみ01を含む文字列ではなく、より多くの1,000,000以上の長さを。
出力
ライン整数は0に等しく、長さ1のサブストリングの最大数。
サンプル入力
1011
サンプル出力
2
データ範囲の制限
データ列の長さの30%<20
思考
質問は食べるのが難しい結果と、とても快適だった直面しています。。。私は言いませんでした
30:暴力
60ポイント:接頭辞。しかし、私は、70ポイント少し巧妙なものを使用し、実際の結果への暴露などを(
100ポイント
プレフィックスとプレフィックス0は、2つのポイント1との間の差に等しくなるように、それは、数学の問題が考慮されるべきである、2つの系列の間の01ポイントが正当なものです。ただ、自分自身にいくつかの栗の十分を与えます。貧しいレコードプレフィックスとプレフィックス0 1が最も再び表示されるようになった場合は答えを更新し、違いを発見しました。
#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
const int M=1000000;//要加 M是因为0和1的差可能是负数
long long Gun,a,f[2000100];
string s;
int main(){
freopen("string.in","r",stdin);
freopen("string.out","w",stdout);
cin>>s;
for(int i=0;i<s.size();i++){
if(s[i]=='0')a++;
else a--;
if(a==0&&i+1>Gun)Gun=i+1;
if(f[a+M]==0)f[a+M]=i+1;//记录差的初始位置
else
Gun=max(Gun,i+1-f[a+M]);
}
printf("%lld",Gun);
}