xor基底
数列Aから、「それらからいくつか選んでxorを取ることで最大種類の数字が作れる」基底を取り出すことができる。
baseの数は
$ log_2max(A)
で抑えられるはず(xor基底の性質から)
出典-noshiさんのツイート
解説-「XORの基底をめっちゃ楽に求める方法があるらしい!!!???」
code:cpp
vector<int> base;
for(int v : A){
for(int e : base){
v = min(v, v ^ e);
}
if(v > 0) base.push_back(v);
}