線形時間の複雑さでビット単位の OR 合計または配列を見つけるアルゴリズムはありますか?
配列が {1,2,3} の場合、すべてのペアの合計 ID は 1|2 + 2|3 + 1|3 = 9 とします。
次のアルゴリズムを使用して、O(n) 内のすべてのペア AND 合計を見つけることができます。これを変更して、すべてのペア OR 合計を取得するにはどうすればよいですか。
int ans = 0; // Initialize result
// Traverse over all bits
for (int i = 0; i < 32; i++)
{
// Count number of elements with i'th bit set
int k = 0; // Initialize the count
for (int j = 0; j < n; j++)
if ( (arr[j] & (1 << i)) )
k++;
// There are k set bits, means k(k-1)/2 pairs.
// Every pair adds 2^i to the answer. Therefore,
// we add "2^i * [k*(k-1)/2]" to the answer.
ans += (1<<i) * (k*(k-1)/2);
}
ここから: http://www.geeksforgeeks.org/calculate-sum-of-bitwise-and-of-all-pairs/