Codeforces 336C Vasily the Bear and Sequence
問題
n個の正の整数a[i]が与えられる。
a[i]から異なるk個を選びb[0], ..., b[k-1]とする。
b[0] & b[1] & ... & b[k-1]を割り切る2^vのうち、vの最大値を
bの美しさと呼ぶ。(&はビット演算のand)
ただし最大値が存在しないときは美しさは-1である。
美しさを最大にするようなbの選び方を求め、どれか一つ出力せよ。
それが複数あるときは、kが最大になるようなものをどれか一つ出力せよ。
制約条件
n≦10^5
a[i]≦10^9
方針
美しさをiであると決めうちすると、条件に適した選び方というのは、
i番目のビットが1であるa[j]を「全部」とってきて、それの&を取るしかない。
何故なら、i番目のビット以下はなるべく0になっているほうがいいので、なるべく多くの項を取ったほうがよくて、
かつ、問題ではkが最大になるようになので、個数の条件にも適するから。
取ってきたら、それらの&を実際にとって、本当に条件を満たしているかを見ればよい。
ソースコード
int n, a[100000]; int main(){ cin >> n; rep(i, n) cin >> a[i]; for(int v = 30; v >= 0; v--){ unsigned int bit = ~0u; int cnt = 0; rep(i, n) if(a[i] & 1 << v) bit &= a[i], cnt++; if(bit != ~0u && bit != 0 && (bit & (1 << v) - 1) == 0){ cout << cnt << endl; rep(i, n) if(a[i] & 1 << v) cout << a[i] << " "; cout << endl; return 0; } } assert(0); return 0; }