線性基學習
阿新 • • 發佈:2020-09-09
首先板子
const int L = 63; ll d[L]; bool add(ll x) { for(int i = L - 1; i >= 0; i--) if(x & 1ll << i) { if(d[i] == -1) { d[i] = x; return true; } x ^= d[i]; } return false; }
線性基的規模就是你二進位制的位數
如果要判斷兩個線性基的值域相同 只需要依次插入值就好了 詳見agc045 A題解 連結:https://www.cnblogs.com/acmLLF/p/13636575.html
線性基的第L個元素,最高位一定是第L位,且為1
所以要是取最大值,依次從大到小取max異或就行了,因為後面不會覆蓋前面的最高位,但有可能覆蓋低位,所以取個max就行了
最小值直接取線性基中最小值 特殊處理0,注意 因為線性基的值域 一定不包含0
查詢是否存在於此基的值域中,取此數二進位制下每一位,依次從大到小異或,若為1,則異或,若0,則下一位繼續
若異或的最終答案是0,那麼存在