http://www.lydsy.com/JudgeOnline/problem.php?id=4269
裸线性基,一个数取多次就是没取。。。
又有了些新的理解:a数组的前now个元素是基底,也就是可以变成1的位,最大就是所有1都选,次大就是最后一个1不选
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N = 100010; int n, now; ll a[N], bin[40]; void gauss() { now = 1; for(int i = 31; i >= 0; --i) { int x = now; while(x <= n && !(a[x] & bin[i])) ++x; if(x == n + 1) continue; swap(a[now], a[x]); for(int j = 1; j <= n; ++j) if(j != now && a[j] & bin[i]) a[j] ^= a[now]; ++now; //下一个数 ,下一个自由位 } --now; } int main() { bin[0] = 1; for(int i = 1; i <= 31; ++i) bin[i] = bin[i - 1] * 2; scanf("%d", &n); for(int i = 1; i <= n; ++i) scanf("%d", &a[i]); gauss(); ll ans = 0; for(int i = 1; i <= now; ++i) ans ^= a[i]; printf("%lld %lld\n", ans, ans ^ a[now]); //a[now]是最低的位 return 0; }
时间: 2024-10-10 22:56:07