cf1809D-1900-66min

Kai-G發表於2024-07-19

重點在於看出來操作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;
}