题目大意:
有两个长度为n的二进制数a,b,问a里存在多少对可以交换的两位数使得a或b(a||b)结果和初始结果不同?
解题思路:
首先想到a串只有0和1交换才有可能使a||b结果发生变化,进而想到对应的b位置上必须不全是1才可以,但这个题O(n2)的做法会超时,正确的O(n)做法是在遍历a的时候分别统计4种情况的数量,即(ai,bi)——(0,1),(0,0),(1,0),(1,1),结果就是b不全为1情况下,两个值不同的a位置交换的和。
代码如下:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
char a[100100],b[100100];
int main()
{
int n;
cin>>n;
cin>>a>>b;
long long sum1=0,sum2=0,sum3=0,sum4=0;
for(int i=0;i<n;i++)
{
if(a[i]=='0'&&b[i]=='1')sum1++;
if(a[i]=='0'&&b[i]=='0')sum2++;
if(a[i]=='1'&&b[i]=='0')sum3++;
if(a[i]=='1'&&b[i]=='1')sum4++;
}
long long sum=sum1*sum3+sum2*(sum3+sum4);
cout<<sum<<endl;
return 0;
}