题目传送门
思路
这里先写出两个性质:
1. 1. 1. 在一个位置操作两次与没有操作是一样的。
2. 2. 2. 在两个不同位置进行操作,相当于交换两个位置的状态,剩下位置因为经过偶数次变换,所以不变。
那么这题的思路就是统计他们 1 1 1 的数量,看看他们 1 1 1 的数量是否相同,如果相同那么我们统计他们相同位置不同值的个数,根据性质二可得答案就是他们不同的个数。
如果 1 1 1 的个数不相同,我们继续在分类。如果他们个数相差 > 1 \gt1 >1,直接输出 − 1 -1 −1,因为操作一次他最多会让 0 0 0 和 1 1 1 的数量改变 1 1 1。
如果个数相差 1 1 1,如果相同位置不同值的个数大于极大值,就输出 − 1 -1 −1。否则输出相同位置不同值的个数。
代码
#include<bits/stdc++.h>
using namespace std;
int t,n;
string a,b;
signed main(){
cin>>t;
while(t--){
int c=0,a1=0,b1=0;
cin>>n>>a>>b;
for(int i=0;i<n;i++){
c+=(a[i]!=b[i]);
if(a[i]=='1'){
a1++;
}
if(b[i]=='1'){
b1++;
}
}
int ans=0x3f3f3f3f;
if(a1==b1){
ans=c;
}
if(n-a1==b1-1){
ans=min(ans,n-c);
}
cout<<(ans==0x3f3f3f3f?-1:ans)<<endl;
}
return 0;
}