題目連結
CF1615C Menorah (luogu)
CF1615C Menorah (codeforces)
解題思路
這題有三個重要的性質:
-
在同一個點做兩次操作與不在這個點做操作是等價的。
-
給兩個不同的點做操作等價於交換這兩個點。
-
給一個字串做偶數次操作,這個字串的 \(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;
}