1. 程式人生 > 實用技巧 >線性基學習

線性基學習

首先板子

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,那麼存在