想死人的思维题哈哈。
题目传送门
题目意思:
给你两个二进制串,你可以将第一个二进制串的任意两个位置的数字调换,问有多少种方案可以让这两个二进制串按位或的结果改变?
思路:
要从按位或的性质上开始思考。
按位或:有 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;
}
完美撒花~