The Bits CodeForces - 1017B(思维)

The Bits CodeForces - 1017B

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, 010102
OR 100112 = 110112

.

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≤105

) — 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.

Examples
Input

5
01011
11001

Output

4

Input

6
011000
010011

Output

6

Note

In the first sample, you can swap bits that have indexes (1,4)

, (2,3), (3,4), and (3,5)

.

In the second example, you can swap bits that have indexes (1,2)
, (1,3), (2,4), (3,4), (3,5), and (3,6).

题意:

给出两个01串,x,y。问,只交换1次x串中任意两个元素的位置,使得x异或y发生改变,这样的交换有多少种。

思路:现在我们来考虑交换之后异或发生变换的情况有哪些。

① 如果x串的位置为0并且y串的位置也为0的话,那么只要用1和x串这个位置的0交换,这个位置的异或值就一定会发生变换。

② 如果x串的位置为1,并且y串的位置为0的话,那么如果另一个位置x串为0,y串为1,交换x串的这两个位置,异或值也会发生变换。

除了上述的情况外,交换x串都不会使得异或值发生变换。所以我们只要统计相应的情况的个数然后对应相乘再相加就可以了。

(注意用long long)

code:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5+5;
char x[maxn],y[maxn];
int main(){
    int n;
    ll a,b,c,d;
    scanf("%d",&n);
    scanf("%s%s",x,y);
    a = b = c = d = 0;
    for(int i = 0; i < n; i++){
        if(x[i] == '1') a++;
    }
    for(int i = 0; i < n; i++){
        if(x[i] == '0' && y[i] == '0') b++;
        if(x[i] == '0' && y[i] == '1') c++;
        if(x[i] == '1' && y[i] == '0') d++;
    }
    ll ans = a * b + c * d;
    printf("%lld\n",ans);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/codeswarrior/article/details/82389041