二进制或序列

二进制或序列

题意

给出长度为 n 的序列,任意两个数进行或运算后加入序列。

问进行无数次操作后,序列去重后的长度。

思路

定义 fi 表示数 i 可以被序列中的元素或出的值。

fi=i 表示 i 可以被序列中的元素或出来,答案加一。

从小到大枚举每个 i,将 fi or 2jfi or 2j or fi

因为若 i 能被或出 fii or 2j 也能被或出 fi

时间复杂度:O(wlogw)

代码

#include <bits/stdc++.h>
using namespace std;
int f[1 << 20], n, ans;
int main() {
    cin >> n;
    for (int i = 1; i <= n; i ++) {
        int a; cin >> a;
        f[a] = a;
    }
    for (int i = 1; i < (1 << 20); i ++) {
        if (f[i] == i) ans ++;
        for (int j = 0; j < 20; j ++) f[i | (1 << j)] |= f[i];
    }
    cout << ans << "\n";
    return 0;
}
posted @   maniubi  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示