b_51_还是01串(简单数学推导+特判)

给定一个0-1串s,长度为n,下标从0开始,求一个位置k,满足0<=k<=n,
并且子串s[0..k-1]中的0的个数与子串s[k..n-1]中1的个数相等

思路:假设s[0:i]有k个1,则s[i:n-1]有sum-k个1;
推出s[0:i]有k个1,则有i-k个0,则s[i:n-1]有sum-k个1,(因为总和=1的个数)

#include<bits/stdc++.h>
using namespace std;
int main() {
    std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    string s; cin>>s;
    int n=s.size(), sum=0, c=0;
    for (int i=0; i<n; i++) if (s[i]=='1') sum++;
    if (sum==n) return cout<<n, 0; //全1串的最后一个位置满足条件
    if (sum==0) return cout<<0, 0; //全0串类似
    for (int i=0; i<n; i++) {
        if (s[i]=='1') c++;
        if (i-c+1==sum-c) return cout<<i+1, 0;
    }
    return 0;
}
posted @ 2020-10-22 20:41  童年の波鞋  阅读(110)  评论(0编辑  收藏  举报