C. Menorah(思维)
考虑连续两次操作的影响:
1.若对同一个1连续两次操作,无意义。
2.若不同的位置进行两次操作,可以发现,除这两个位置外,其他不变,这两个位置的0,1互换。
所以第一种情况(换偶数次)是如果a,b两个1的个数相同,显然答案就是不同的个数。
第二种情况(换奇数次)就是两个1的个数不同,考虑先换一次,然后归结到第一种情况即可,就是10,11这两种类型 都尝试换一次。
// Problem: C. Menorah
// Contest: Codeforces - Codeforces Global Round 18
// URL: https://codeforces.ml/contest/1615/problem/C
// Memory Limit: 256 MB
// Time Limit: 2000 ms
// Date: 2021-12-25 16:21:37
// --------by Herio--------
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=1e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
const int hashmod[4] = {402653189,805306457,1610612741,998244353};
#define mst(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define x first
#define y second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define per(i,a,b) for(int i=a;i>=b;--i)
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr)
void Print(int *a,int n){
for(int i=1;i<n;i++)
printf("%d ",a[i]);
printf("%d\n",a[n]);
}
template <typename T> //x=max(x,y) x=min(x,y)
void cmx(T &x,T y){
if(x<y) x=y;
}
template <typename T>
void cmn(T &x,T y){
if(x>y) x=y;
}
int n,T;
string a,b;
int fun(string a,string b,int p){
if(p==-1) return inf;
int x = 0 , y = 0;
int dif = 0;
if(p!=-2){
for(int i=0;i<n;i++)
if(i!=p) a[i]=a[i]=='1'?'0':'1';
dif ++;
}
for(int i=0;i<n;i++){
if(a[i]=='1') x++;
if(b[i]=='1') y++;
if(a[i]!=b[i]) dif++;
}
if(x!=y) return inf;
return dif;
}
int main(){
IOS;
cin>>T;while(T--){
cin>>n>>a>>b;
int p1=-1,p2=-1;
for(int i=0;i<n;i++)
if(a[i]=='1' && b[i] == '0') p1=i;
else if(a[i]=='1' && b[i] =='1') p2=i;
int ans = min({fun(a,b,-2),fun(a,b,p1),fun(a,b,p2)});
printf("%d\n",ans==inf?-1:ans);
}
return 0;
}