ull deg(ull num, int deg){ return num & (1ull << deg); }
ull a[MAXN];
intmain(){ int n; scanf("%d", &n); for (int i = 1; i <= n; ++i) scanf("%llu", &a[i]); int row = 1; for (int col = 63; ~col && row <= n; --col) { for (int i = row; i <= n; ++i) { if (deg(a[i], col)) { std::swap(a[row], a[i]); break; } } if (!deg(a[row], col)) continue; for (int i = 1; i <= n; ++i) { if (i == row) continue; if (deg(a[i], col)) { a[i] ^= a[row]; } } ++row; } ull ans = 0; for (int i = 1; i < row; ++i) { ans ^= a[i]; } printf("%llu\n", ans); return0; }
voidinsert(longlong t) { // 逆序枚举二进制位 for (int j = MAXL; j >= 0; j--) { // 如果 t 的第 j 位为 0,则跳过 if (!(t & (1ll << j))) continue;
// 如果 a[j] != 0,则用 a[j] 消去 t 的第 j 位上的 1 if (a[j]) t ^= a[j]; else { // 找到可以插入 a[j] 的位置
// 用 a[0...j - 1] 消去 t 的第 [0, j) 位上的 1 // 如果某一个 a[k] = 0 也无须担心,因为这时候第 k 位不存在于线性基中,不需要保证 t 的第 k 位为 0 for (int k = 0; k < j; k++) if (t & (1ll << k)) t ^= a[k];
// 用 t 消去 a[j + 1...L] 的第 j 位上的 1 for (int k = j + 1; k <= MAXL; k++) if (a[k] & (1ll << j)) a[k] ^= t;
// 插入到 a[j] 的位置上 a[j] = t;
// 不要忘记,结束插入过程 return; }
// 此时 t 的第 j 位为 0,继续寻找其最高位上的 1 }
// 如果没有插入到任何一个位置上,则表明 t 可以由 a 中若干个元素的异或和表示出,即 t 在 span(a) 中 } };