2 条题解
-
0
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int MAXK = 105; int k; ll a[MAXK]; ll basis[65]; // 线性基 bool insert(ll x) { for (int i = 63; i >= 0; i--) { if (!(x >> i)) continue; if (!basis[i]) { basis[i] = x; return true; } x ^= basis[i]; } return false; } int main() { scanf("%d", &k); ll sum = 0; for (int i = 0; i < k; i++) { scanf("%lld", &a[i]); sum += a[i]; } // 从大到小排序 sort(a, a + k, greater<ll>()); ll ans = 0; for (int i = 0; i < k; i++) { if (!insert(a[i])) { ans += a[i]; // 不能插入线性基,即可以拿走 } } printf("%lld\n", ans); return 0; } -
0
未开发
using namespace std; typedef long long ll; const int N = 110, len = 32; bool vis[N]; ll a[N], b[N]; int n; bool insert(ll x) { for(int j = len; j >= 0; --j) { if((x & (1ll << j))== 0) continue; if(b[j]) x ^= b[j]; else{ for(int k = j - 1; k >= 0; --k) { if(x & (1ll << k)) x ^= b[k]; } for(int k = len; k >= j + 1; --k) { if(b[k] & (1ll << j)) b[k] ^= x; } b[j] = x; return true; } } return false; } int main() { scanf("%d", &n); for(int i = 0; i < n; ++i) scanf("%lld", &a[i]); sort(a, a + n, greater<int>()); int cnt = 0; ll sum = 0; for(int i = 0; i < n; ++i) { if(insert(a[i])) vis[i] = true, cnt++; else sum += a[i]; } if(cnt == 1) printf("-1\n"); else printf("%lld\n", sum); return 0; }
- 1
信息
- ID
- 140
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 8
- 标签
- 递交数
- 22
- 已通过
- 5
- 上传者