給定 n 個數對,每對含值 a 和權 x。選擇若干數使其異或和不為 0,最大化權值和。等價於:構造線性基,貪心選擇高權值向量。
按權值從大到小排序,依次嘗試插入線性基。若能插入(與現有基向量無衝突),則選取該元素。正確性可用拟阵理論證明:獨立系統滿足交換性質,貪心最優。
struct Node { ll val; int w; } a[N];
bool cmp(Node a, Node b) { return a.w > b.w; }
ll basis[66], ans;
for (int i = 1; i <= n; ++i) {
ll x = a[i].val;
for (int k = 60; k >= 0; --k) {
if ((x >> k) & 1) {
if (!basis[k]) { basis[k] = x; break; }
x ^= basis[k];
}
}
if (x) ans += a[i].w; // 成功插入,累加權值
}
排序 O(n log n),插入每數 O(log MAXA),總體 O(n log n + n log MAXA),n ≤ 1000 極快。