想死人的思维题哈哈。
题目传送门
题目意思:
给你两个二进制串,你可以将第一个二进制串的任意两个位置的数字调换,问有多少种方案可以让这两个二进制串按位或的结果改变?
思路:
要从按位或的性质上开始思考。
按位或:有 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;
}
完美撒花~
文章讲述了如何通过计数变量x和y计算在给定两个二进制串的情况下,通过交换字符使得按位或结果不同的方案数。主要思路是利用按位或的性质,记录1的匹配和不匹配情况。

被折叠的 条评论
为什么被折叠?



