【题解】二进制换位
题意
有两个长度为的二进制数
,
,这里
表示按位与,问在
中交换一次任意两位上的数字,会产生多少中新的
。
题解
由于是对中的两位进行交换,且进行的是按位与操作,什么情况下会导致与的结果不同呢,当
a 0 b 1
为这种情况时将的
和某一个
交换,会使结果不同。
或
a 1 b 1
为这种情况时将的
和某一个
交换,也会使结果不同。
那就得考虑贡献的问题了,如何不重复。先预处理出中的所有
的个数记为
。考虑遇到
这种情况时,每一个这里的
都有
种交换方法,我们令答案加上
。
那遇到这种情况时我们可以用
替换掉
来使答案不同,但是我们前面
里面已经将这个
和这里的
交换过了,所以我们这里的
应该与所有
中的
进行交换,所以我们还需要预处理一下
的个数,记为
,当遇到
时,答案加上
即可。
复杂度
时间复杂度
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
string a,b;
cin>>a>>b;
int n=a.length();
int num0=0;
int num1=0;
for(int i=0; i<n; i++)
{
if(a[i]=='1')
num1++;
else if(a[i]=='0'&&b[i]=='0')
num0++;
}
long long ans=0;
for(int i=0; i<n; i++)
{
if(b[i]=='1'&&a[i]=='0')
ans+=num1;
else if(b[i]=='1'&&a[i]=='1')
ans+=num0;
}
printf("%lld\n",ans);
}
}
