线性基就是处理异或操作的一系列基向量。
用到了高斯消元的思想维护了一个对角矩阵。
引用了其他dalao博客中的一段话
我们每次维护一个对角矩阵。执行到第 i 步的时候,我们从高到低考虑数 ai为 1 的二进制位j,如果 j 这一行的对角线已经为 1 了,那么我们不能加入,同时为了保持上三角性质,需要将第j 行的行向量异或到 ai;如果 j 这一行的对角线为 0,那么我们就可以将 ai添加到这一行,同时为了维护一个对角矩阵,要先用下面的行消自己,再用自己消上面的行。
for(int i=1; i<=n; i++)
for(int j=62; j>=0; j--)
{
if(a[i] >> j & 1)
{
if(b[j]) a[i] ^= b[j];
else
{
b[j] = a[i];
for(int k=j-1; k>=0; k--)
if(b[k] && (b[j] >> k & 1)) b[j] ^= b[k];
for(int k=j+1; k<=62; k++)
if(b[k] >> j & 1) b[k] ^= b[j];
break;
}
}
}
b[]数组则是构造出来的线性基