首页 > 其他分享 >abc269C - Submask(位运算)

abc269C - Submask(位运算)

时间:2022-10-10 12:55:05浏览次数:71  
标签:10 运算 int abc269C ans Submask 思路

abc269C - Submask(源地址自⇔Atcode

目录


tag

⇔位运算。

题意

给出一个数字 \(N\) ,输出所有满足条件的 \(X\) ,使得 \(X\) 的二进制位中 \(1\) 的排布是 \(N\) 的二进制位中 \(1\) 的排布的子集。

思路

个人思路

直接丢进 \(\tt DFS\) 里面,每次改一位 \(1\) 。使用 \(\tt bitset\) 简化运算。

大佬思路

裸的枚举子集,直接跑一遍 for (int i = x; i; i = (i - 1) & x) 这个循环即可。

AC代码

点击查看代码

个人思路

// Date: 2022-10-10 10:33:47
// Problem: C - Submask
// Contest: AtCoder - UNICORN Programming Contest 2022(AtCoder Beginner Contest 269)
// URL: https://atcoder.jp/contests/abc269/tasks/abc269_c
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
// --------By WIDA--------

#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define int LL
const int N = 1e6 + 7;

set<int> ans;
void dfs(bitset<60> x) {
	ans.insert(x.to_ullong());
	for (int i = 0; i < 62; ++ i) {
		if (x[i] == 0) continue;
		x[i] = 0;
		if (!ans.count(x.to_ullong())) dfs(x);
		x[i] = 1;
	}
}
signed main() {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	
	int n; cin >> n;
	bitset<60> B = n;
	dfs(B);
	for (auto it : ans) cout << it << "\n";
	
	return 0;
}

大佬思路

摘自本篇博客

#include <bits/stdc++.h>
#define int long long
using namespace std;
int x;
stack<int> st;

signed main() {
    cin >> x;
    for (int i = x; i; i = (i - 1) & x) st.push(i);
    cout << 0 << endl;
    while (!st.empty()) {
        cout << st.top() << endl;
        st.pop();
    }
    return 0;
}

错误次数:1

搜索前没有判断是否已经被搜索过,导致重复搜索,T。加上 if (!ans.count(x.to_ullong())) 即可。


文 / WIDA
2022.10.10 成文
首发于WIDA个人博客,仅供学习讨论


标签:10,运算,int,abc269C,ans,Submask,思路
From: https://www.cnblogs.com/WIDA/p/16775282.html

相关文章

  • Verlog逻辑运算
    位运算符按位运算的运算符是位运算符,原来的操作数有几位,结果就有几位,若两个操作数位数不同,则位数短的操作数左端会自动补.。按位取反:~按位与:&按位或:|按位异或:^按位同......
  • 使用位运算验证一个数是否为奇数?
    位运算是我们学习计算机时,常面对的计算,但是他的实际用途,我们无法知晓,下文笔者将讲述使用位运算的方式验证奇数,偶数的方法,如下所示:下文是笔者验证一个数是否为奇数的方法实......
  • 多层三目运算符
    参考:https://blog.csdn.net/qq_36138652/article/details/115789463......
  • 运算符
    java中支持的运算符算数运算符+,-,*,/,%,++,--+,左右任意一侧存在字符串,那么一定进行字符串拼接++,在单独使用的时候,不困放在前后,都是加1的操作++......
  • C++运算符
    目录 ​​算术运算符(进行四则运算)​​​​赋值运算符(表达式的值赋给变量)​​​​比较运算符(表达是比较,返回一个真值或假值)​​​​逻辑运算符(返回表格式的结果真或......
  • 位位运算
    位位运算思路观察一下题中所说的“将其中一个数变为\(a\)\(and\)\(b\),另一个变成\(a\)\(or\)\(b\)”,这个操作事实上是将\(a\)和\(b\)对应二进制位不同的\(0\)和\(1......
  • 位位运算 方法记录
    题解位运算简单理解:and(&):有假则假;or(|):有真则真;不妨从输入样例入手,看看能有什么发现。举几个例子:1(001)&2(010)==3(011)1(001)|2(010)==0(000)2(010......
  • python调用c++的方法,加速运算
    cpp源代码#include"iostream"usingnamespacestd;classCalc{public:intadd(inta,intb);};intCalc::add(inta,intb){cout<<"收到参数为a,b:"<<a<......
  • 位位运算 方法记录
    题解我们首先来分析小朋友的三个指标:手里的数,特征值,分数。手里的数:即我们输入的长度为\(n\)的序列;特征值:从第一个小朋友到当前小朋友的手上的数的最大子段和;分数......
  • java---了解以下运算符
    了解即可1&2用于条件判断,&条件1和2都执行1&&2,条件1判断错误的情况下,条件2不执行&当运算符的化,例如4&7,两者上下对比都是1则为1,反之为0,结果就是二进制100也就是......