想死人的思维题哈哈。
题目传送门
题目意思:
给你两个二进制串,你可以将第一个二进制串的任意两个位置的数字调换,问有多少种方案可以让这两个二进制串按位或的结果改变?
思路:
要从按位或的性质上开始思考。
按位或:有 1
就是 1
,没 1
就是 0
。
那么如果想让两个二进制串的按位或结果改变,就要尽量改变 1
和 0
的配对。
那么:
- 用两个计数变量 x x x 和 y y y 来记录两种情况出现的次数。 x x x 用来记录第一个二进制串中
1
出现的次数。 y y y 用来记录第一个二进制串的第 i i i 个位置是1
,第二个二进制串的第 i i i 个位置是0
的对数。 - 如何记录答案呢?如果第一个二进制串的第 i i i 个位置是
0
,并且第二个二进制串的第 i i i 个位置也是0
,那么这种情况就只需要将第一个二进制串的0
改成1
即可,即答案加上 x x x。 - 如果不是上面这种情况,而是第一个二进制串的第 i i i 个位置是
0
,第二个二进制串的第 i i i 个位置是1
,那答案就要加上 y y y。因为虽然将当前第一个二进制串的位置的0
改成1
结果没改变,但是却把另外一边的10
改成了00
,结果就改变了,所以是加上 y y y。
比较复杂呵呵。
代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
string a,b;
int x,y;
int ans;
signed main()
{int n;cin>>n;cin>>a>>b;for(int i=0;i<a.size();i++){if(a[i]=='1')x++;if(a[i]=='1'&&b[i]=='0')y++;}for(int i=0;i<a.size();i++){if(a[i]=='0'){if(b[i]=='0')ans+=x;else ans+=y;}}cout<<ans;return 0;
}
完美撒花~