「雜題亂刷2」CF1615C Menorah

wangmarui發表於2024-07-15

題目連結

CF1615C Menorah (luogu)

CF1615C Menorah (codeforces)

解題思路

這題有三個重要的性質:

  1. 在同一個點做兩次操作與不在這個點做操作是等價的。

  2. 給兩個不同的點做操作等價於交換這兩個點。

  3. 給一個字串做偶數次操作,這個字串的 \(0\) 的數量和 \(1\) 的數量不會改變。

知道這三個性質,這題就很好做了,直接分操作次數的奇偶性來討論即可,詳見程式碼。

時間複雜度 \(O(n)\)

參考程式碼

點選檢視程式碼
#include<bits/stdc++.h>
using namespace std;
//#define map unordered_map
#define re register
#define ll long long
#define forl(i,a,b) for(re ll i=a;i<=b;i++)
#define forr(i,a,b) for(re ll i=a;i>=b;i--)
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define endl '\n'
#define QwQ return 0;
#define cfy cout<<"YES\n";
#define cfn cout<<"NO\n";
ll t;
/*
一個位置不會被做 2 次操作

100010111 --> 4 5 
111101000 --> 4 5
010010111 --> 4 5
101101100 --> 4 5 

100000000 --> 8 1
111111111 --> 0 9
010000000 --> 8 1
111111111 --> 0 9
*/
ll n;
string s1,s2,s3;
ll sum0,sum1,sum2,sum3,ans;
void solve()
{
	sum0=sum1=sum2=sum3=ans=0;
	ans=1e18;
	cin>>n>>s1>>s2;
	s1=' '+s1;
	s2=' '+s2;
	forl(i,1,n)
		sum0+=s1[i]=='0',sum1+=s1[i]!='0';
	forl(i,1,n)
		sum2+=s2[i]=='0',sum3+=s2[i]!='0';
	if(sum0==sum2 && sum1==0)
	{
		cout<<0<<endl;
		return ;
	}
	else if(sum1==0)
	{
		cout<<-1<<endl;
		return ;
	}
	ll ke1=sum0+1,ke0=n-ke1;
//	cout<<ke0<<' '<<ke1<<endl; 
	if(!((sum0==sum2 && sum1==sum3) || (ke0==sum2 && ke1==sum3)))
	{
		cout<<-1<<endl;
		return ;
	}
	s3=s1;
	forl(i,1,n)
	{
		if(s3[i]=='0')
			s3[i]='1';
		else
			s3[i]='0';
	}
	if(sum0==sum2 && sum1==sum3)
	{
		ll sum=0;
		forl(i,1,n)
			if(s1[i]!=s2[i])
				sum++;
		ans=min(ans,sum);
	}
	if(ke0==sum2 && ke1==sum3)
	{
		ll sum=0;
		forl(i,1,n)
			if(s3[i]!=s2[i])
				sum++;
		ans=min(ans,sum);
	}
	cout<<ans<<endl;
}
int main()
{
	IOS;
	t=1;
 	cin>>t;
	while(t--)
		solve();
	QwQ;
}