做法:线性基+贪心
先手必胜。 游戏的结论是所有数的和不为则先手胜。因为自己可以取一次来修改局面,对手也可以取一次来修改局面,那么现在的目标就变成了取走最少的石头堆,让剩下的石头没有一个非空子集的和为
而线性基刚好满足这一性质。所以问题就变成了构造一个线性基,使其包含的石子数最多。这个将石子降序插入线性基即可。
这是强行两个结论拼起来的题...

#include <bits/stdc++.h>
using namespace std;

#define ll long long
const int N = 100010;

ll ans = 0, a[N];

struct lb {
    int p[64];
    void insert(ll x) {
        ll now = x; 
        for(ll i = 63; i >= 0; --i) {
            if((x >> i) & 1LL) {
                if(p[i]) x ^= p[i];
                else {
                    p[i] = x;
                    ans -= now;
                    return;
                }
            }
        }
    }
} B; 

int main() {
    int n; scanf("%d", &n);
    for(int i = 1; i <= n; ++i) scanf("%lld", &a[i]), ans += a[i];
    sort(a + 1, a + n + 1); reverse(a + 1, a + n + 1);
    for(int i = 1; i <= n; ++i) B.insert(a[i]);
    printf("%lld\n", ans);
}