1. 程式人生 > >SGU 275 異或線性基

SGU 275 異或線性基

題目連結

題意:給你n個數,求這些數能夠異或出的最大值是多少?

思路:
異或線性基的入門題。

求這n個數的異或線性基,由性質,線性基裡所有的數的異或和就是所需要求的最大值。

至於構建線性基的方法,類似於高斯消元的思想,還是很好理解的~

程式碼:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;

const int A = 100 + 10;
ll a[A],b[A];

void solve(int
n){ for(int i=1 ;i<=n ;i++) for(int j=62 ;j>=0 ;j--){ if((a[i]>>j)&1){ if(b[j]) a[i]^=b[j]; else{ b[j] = a[i]; for(int k=j-1 ;k>=0 ;k--) if(b[k]&&((b[j]>>k)&1)) b[j] ^= b[k]; for(int
k=j+1 ;k<=62;k++) if((b[k]>>j)&1) b[k] ^= b[j]; break; } } } ll ans = 0; for(int i=0 ;i<=62 ;i++) ans ^= b[i]; printf("%I64d\n",ans); } int main(){ int n;scanf("%d",&n); for(int i=1 ;i<=n ;i++) scanf("%I64d",&a[i]); solve(n); return
0; }