二進位制或序列

maniubi發表於2024-09-16

二進位制或序列

題意

給出長度為 \(n\) 的序列,任意兩個數進行或運算後加入序列。

問進行無數次操作後,序列去重後的長度。

思路

定義 \(f_i\) 表示數 \(i\) 可以被序列中的元素或出的值。

\(f_i=i\) 表示 \(i\) 可以被序列中的元素或出來,答案加一。

從小到大列舉每個 \(i\),將 \(f_{i \text{ or } 2^j} \gets f_{i \text{ or }2^j} \text{ or } f_i\)

因為若 \(i\) 能被或出 \(f_i\)\(i \text{ or } 2^j\) 也能被或出 \(f_i\)

時間複雜度:\(O(w \log w)\)

程式碼

#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;
}

相關文章