維護 n 個變量的異或關係,支持三種操作:賦值、異或等式、查詢異或和。需檢測矛盾並輸出第一條衝突的賦值操作編號;查詢無法確定時輸出 "I don't know."。
f[x]:父節點d[x]:x 到父節點的異或值int getfar(int x) {
if (x == f[x]) return x;
int tmp = f[x];
f[x] = getfar(f[x]);
d[x] ^= d[tmp]; // 路徑壓縮時更新異或值
return f[x];
}
// 合併:p, q 為根節點,k 為 u^v 的值
if (p != q) { f[p] = q; d[p] = d[u]^d[v]^k; }
else return (d[u]^d[v]) != k; // 矛盾檢測
將查詢集合按根節點分組。若某組大小為奇數且根 ≠ 0,則無法確定值;否則異或所有 d[num[i]] 即為答案。