You are given a set of size $m$ with integer elements between $0$ and $2^{n}-1$ inclusive. Let’s build an undirected graph on these integers in the following way: connect two integers $x$ and $y$ with an edge if and only if $x \& y = 0$. Here $\&$ is the bitwise AND operation. Count the number of connected components in that graph.
Input
In the first line of input there are two integers $n$ and $m$ ($0 \le n \le 22$, $1 \le m \le 2^{n}$).
In the second line there are $m$ integers $a_1, a_2, \ldots, a_m$ ($0 \le a_{i} < 2^{n}$) — the elements of the set. All $a_{i}$ are distinct.
Output
Print the number of connected components.
Examples
input
2 3
1 2 3
output
2
input
5 5
5 19 10 20 12
output
2
Note
Graph from first sample:

Graph from second sample:

Solution:
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int n, m;
cin >> n >> m;
vector<int> was(1 << n, 1);
for (int i = 0; i < m; i++) {
int x;
cin >> x;
was[x] = 0;
}
vector<int> used(1 << n, 0);
vector<int> que(1 << n);
vector<int> inner(1 << n);
int ans = 0;
for (int start = 0; start < (1 << n); start++) {
if (was[start]) {
continue;
}
ans++;
was[start] = 1;
que[0] = start;
int qs = 1;
for (int q = 0; q < qs; q++) {
int u = (1 << n) - 1 - que[q];
if (!used[u]) {
used[u] = 1;
inner[0] = u;
int is = 1;
for (int i = 0; i < is; i++) {
int z = inner[i];
if (!was[z]) {
was[z] = 1;
que[qs++] = z;
}
for (int bit = 0; bit < n; bit++) {
if ((z & (1 << bit)) && !used[z ^ (1 << bit)]) {
used[z ^ (1 << bit)] = 1;
inner[is++] = z ^ (1 << bit);
}
}
}
}
}
}
cout << ans << '\n';
return 0;
}
Related posts:
T-shirt buying
Unsolvable
Upgrading Tree
Potions Homework
Random Ranking
Constrained Tree
Parity
Graph Coloring
Dijkstra on sparse graphs
Bathroom terminal
Dream Team
Paint the edges of the tree
Magic Odd Square
Another One Bites The Dust
Optimal Subsequences (Easy Version)
Cron
Big Data
Beautiful Bracket Sequence (easy version)
Linear Diophantine Equation
Three Problems
Counting Rectangles is Fun
A + B Strikes Back
Prefix function. Knuth–Morris–Pratt algorithm
Optimal schedule of jobs given their deadlines and durations
Suffix Automaton
Minimum spanning tree - Prim's algorithm
Range Minimum Query
Promocodes with Mistakes
Maximum Flow
Kay and Snowflake
Correcting Mistakes
Bracket Sequence