RT,WA on #3,样例过了,思路:二分答案+预处理
#include<bits/stdc++.h>
#define int long long
#define Tothetime_tolife using
#define AK namespace
#define IOI std
Tothetime_tolife AK IOI;
const int Mod1=998244353;
const int Mod2=1000000007;
int gcd(int a,int b){return __gcd(a,b);}
int lcm(int a,int b){return a*b/gcd(a,b);}
void read(int& x){char ch;int f=1;x=0;while(ch<'0'||ch>'9'){ch=getchar();if(ch=='-') f=-1;}while(ch>='0'&&ch<='9'){ch=getchar();x=x*10+ch-'0';}x*=f;}
void write(int x){if(x>9){write(x/10);}putchar(x%10+'0');return;}
void we(int x){write(x);printf("\n");}
void wk(int x){write(x);printf(" ");}
void wr(int x){write(x);}
void re(int x){read(x);}
const int N=200005;
int qz[N],hz[N],qz1[N],hz1[N],sum,tot;
string s;
int check(int x){
int res=2147483647;
for(int i=0;i<=x;i++){
res=min(res,sum-qz[qz1[i+1]-1]-hz[hz1[x-i+1]+1]);
}
if(res>x) return 0;
else return 1;
}
signed main(){
int t;
scanf("%lld",&t);
while(t--){
cin>>s;
sum=0;tot=0;
for(int i=0;i<s.size();i++){
if(s[i]=='0'){
sum++;
qz[i]=qz[i-1]+1;
}else{
tot++;
qz[i]=qz[i-1];
}
}
for(int i=s.size()-1;i>=0;i--){
if(s[i]=='0'){
hz[i]=hz[i+1]+1;
}else{
hz[i]=hz[i+1];
}
}
int cnt=0;
for(int i=0;i<s.size();i++){
if(s[i]=='1'){
qz1[++cnt]=i;
}
}
cnt=0;
for(int i=s.size()-1;i>=0;i--){
if(s[i]=='1'){
hz1[++cnt]=i;
}
}
if(sum==s.size() || tot==s.size()){
printf("0\n");
continue;
}
int l=0,r=s.size(),ans=0;
while(l<=r)
{
int mid=(l+r)>>1;
if(check(mid)){
r=mid-1;
ans=mid;
}else{
l=mid+1;
}
}
printf("%lld\n",ans);
}
return 0;
}
//STO 来看我程序的人 Orz