F (X 、Y )= (X | Y )- バイナリ分割でYビットは、ビットiについて見出さ
Xは、Yは、I-1の両方である場合、関数の結果のビットiが0であります
ときにi番目のビットX 0、i番目のビットが1であり、Y、関数結果がビットI 0であります
私は、xが1である場合、Y i番目のビットが0であるIビット、関数の結果は、ビットiは
以下のためのF (F (... F (F (A 1 、A 2 )、A 。3 )、... A N- - 1 )、A N- )どんなに行番号の順序私はちょうど1ビット機能≥2Nリニアi番目の演算結果後のビットが0であります
証明:
1. A1 i番目のビットが0の場合に関係なく、関数計算結果のn番目の行はiが0であるビットどのようにしない場合
i番目のビットの結果の関数は、最初のケースの後に0になるように、i番目のビットa1はi番目のビット番号1の後に1秒に遭遇した2
したがって、最終的な答えは、最初の数に依存する、ビット数nに一度だけ現れる最初の数
だから、始め貪欲高いから、ほとんどに答えるために、限り、このビットは、背中のループを抜けるに一度だけ表示され、明らかに素晴らしいの位置に影響を与えなかったとして、
反射1.計算し、ハイからローへの通常貪欲最大値を、選択ビットを含む質問については、決定的スプリットビットでなければなりません
これは、ほんの数年程度であるが、また、ビットに応じてはなりません
2.関数が反復時間xxを&Yと等価であるミスShabi F(F(x、y)を、Z)= X-X&Y-X&Y&Zをした結果は、2つだけの機能を反復されるどのように関係なく事実は
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 CONST INT N = 1E5 + 5 。 int型[N]と、 int型のmain(){ int型、nは cinを >> N; 以下のために(INT iが= 1 ; I <= N; I ++)CIN >> [I]。 int型 ANS = 0 ; 以下のために(INT iが= 30、I> = 0 ; i-- ){ int型 CNT = 0、POS = 0 。 以下のための(int型 J =1 ; jは<= N; J ++ ) 場合([J]&(1 << I)){ CNT ++ 。 POS = J; } であれば(CNT == 1 ){ ANS = POS。 ブレーク;} } もし(ANS == 0)のための(INT iは= 1 ; I <= N; I ++)COUT << [I] << ' ' 。 他{ COUT << [ANS] << ' ' 。 以下のための(int型私は= 1 ; I <= N; I ++ ) の場合(ANS = I)はcout << [I] <<!' ' ; } 戻り 0 。 }