Codeforces 1017B The Bits 题解

题目链接:

http://codeforces.com/problemset/problem/1017/B

Description

Rudolf is on his way to the castle. Before getting into the castle, the security staff asked him a question:
Given two binary numbers a and b of length n. How many different ways of swapping two digits in a (only in a, not b) so that bitwise OR of these two numbers will be changed? In other words, let c be the bitwise OR of a and b, you need to find the number of ways of swapping two bits in a so that bitwise OR will not be equal to c.
Note that binary numbers can contain leading zeros so that length of each number is exactly n.
Bitwise OR is a binary operation. A result is a binary number which contains a one in each digit if there is a one in at least one of the two numbers. For example, (01010)2 OR (10011)2 = (11011)2.
Well, to your surprise, you are not Rudolf, and you don’t need to help him… You are the security staff! Please find the number of ways of swapping two bits in a so that bitwise OR will be changed.

Input

The first line contains one integer n (2≤n≤10^5) — the number of bits in each number.
The second line contains a binary number a of length n.
The third line contains a binary number b of length n.

Output

Print the number of ways to swap two bits in a so that bitwise OR will be changed.

题目大意:

有两个二进制的数,分别为a、b,假设a or b的值为c,当a中交换两个数后,c的值可能发生变化,求能使c发生变化的方案总数。

提示:

这道题是一道比较简单的思维题,我们仔细寻找规律就可以了。我们可以扫描b这个二进制数。
1. 如果b[i]为1的话,不论它对应的a[i]是0还是1,c[i]一定还是1,所以只用考虑b[i]为0的情况。
2. 当b[i]=0,对应的a[i]=1时,方案总数只要加上a中有的0的个数即可,用a[i]与其交换。
3. 当b[i]=0,a[i]=0时,同样要将它换成1才能达到目的。假设a[j]=1,如果b[j]也等于1,那么可以放心将a[i]与a[j]交换。当a[j]=1,b[j]=0时,那就可以不计入答案了。因为这种情况在第二步中算过了。

所以,只要预处理b[i]==1&&a[i]==1和a[i]==0的个数就可以了。

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
#define N 100001
using namespace std;
char a[N],b[N];
int n;
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++) cin>>b[i];
    int s0=0,s11=0;
    long long ans=0;
    for(int i=1;i<=n;i++)
    {
        if(a[i]=='0') s0++;
        else if(b[i]=='1') s11++;
    }
    for(int i=1;i<=n;i++) if(b[i]=='0')
    {
        if(a[i]=='0') ans+=s11;
        else ans+=s0;
    }
    cout<<ans<<endl;
    return 0;
}

相关链接:

Codeforces 题解小全:
https://blog.csdn.net/ZJ_MRZ/article/details/81530091

Codeforces 1016A Death Note 题解:
https://blog.csdn.net/ZJ_MRZ/article/details/81474520

Codeforces 1017A The Rank 题解:
https://blog.csdn.net/ZJ_MRZ/article/details/81529980

posted @ 2018-08-09 09:58  ZJ_MRZ  阅读(155)  评论(0编辑  收藏  举报