cf1809D-1900-66min
重点在于看出来操作1至多执行一次,之后就很容易了 ,加上一些预处理的小优化就能过,就是代码逻辑比较复杂,对coding能力有一些要求
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <list>
#define int long long
using namespace std;
string s;
int ans;
int count1[1000005],count0[1000005];
void solution()
{
cin>>s;
//cout<<s;
ans=10e17;
for(int i=0;i<=s.size()-1;i++)
{
if(s[i]=='1')
{
if(i>0)count1[i]=count1[i-1]+1;
else count1[i]=1;
}
else
{
if(i>0)count1[i]=count1[i-1];
else count1[i]=0;
}
}
for(int i=s.size()-1;i>=0;i--)
{
if(s[i]=='0')
{
if(i<s.size()-1)count0[i]=count0[i+1]+1;
else count0[i]=1;
}
else
{
if(i<s.size()-1)count0[i]=count0[i+1];
else count0[i]=0;
}
}
for(int i=0;i<=(int)(s.size())-2;i++)
{
int count=0;
if(s[i]=='1'&&s[i+1]=='0')
{
// for(int j=i-1;j>=0;j--)
// {
// if(s[j]=='1')count++;
// }
// for(int j=i+2;j<s.size();j++)
// {
// if(s[j]=='0')count++;
// }
int c1,c2;
if(i-1>=0)c1=count1[i-1];
else c1=0;
if(i+2<=s.size()-1)c2=count0[i+2];
else c2=0;
count=c1+c2;
ans=min(ans,(int)((count+1)*10e11+count));
}
else
{
// for(int j=i-1;j>=0;j--)
// {
// if(s[j]=='1')count++;
// }
// for(int j=i+2;j<s.size();j++)
// {
// if(s[j]=='0')count++;
// }
int c1,c2;
if(i-1>=0)c1=count1[i-1];
else c1=0;
if(i+2<=s.size()-1)c2=count0[i+2];
else c2=0;
count=c1+c2;
//cout<<count1[i-1]<<' '<<count0[i+2]<<' '<<ans<<endl<<endl<<endl;
ans=min(ans,(int)(count*10e11+count));
}
//cout<<i<<' '<<ans<<endl;
//cout<<i<<' '<<s.size()-2<<endl;
}
int flag=1;
for(int i=1;i<=s.size()-1;i++)
{
if(s[i]!=s[i-1])
{
flag=0;
break;
}
}
if(flag==1)ans=0;
cout<<ans<<endl;//<<endl<<endl;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
int T;
cin>>T;
while(T--)
solution();
return 0;
}