CF986C 题解
思路
这题当然不能暴力建图,会超时。不难发现,(此处的 指按位与)时,。于是我们只要枚举每个 的子集就行了。
代码
# include <bits/stdc++.h>
using namespace std;
int n, maxx, a[4200005], sum;
bitset <4200005> vis, ina; //bitset 优化,另外切忌用 vector!
void dfs (int x) {
vis[x] = 1;
if (ina[x] && ! vis[x ^ maxx]) //如果 x 在 a 中,x ^ maxx 就是 x & b = 0 时 b 能达到最大的值。
dfs (x ^ maxx);
for (int i = x; i; i ^= i & -i)
if (! vis[x ^ (i & -i)])
dfs (x ^ (i & -i));
return ;
}
int main () {
ios::sync_with_stdio (0);
cin.tie (0);
cout.tie (0);
cin >> maxx >> n;
maxx = (1 << maxx) - 1;
for (int i = 0; i < n; ++ i)
cin >> a[i], ina[a[i]] = 1;
for (int i = 0; i < n; ++ i)
if (! vis[a[i]])
vis[a[i]] = 1, dfs (a[i] ^ maxx), ++ sum;
cout << sum;
return 0;
}

浙公网安备 33010602011771号