题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=275
题意:从n个数中选出若干个数使得这些数的抑或值最大。
思路:从二进制位的角度考虑。从最高位判断能否为1。
int n;
int a[70][105],b[70][105],p[70];
int Gauss(int n,int m,int a[][105])
{
int i,j,k,t;
for(i=0,j=0;i<n&&j<m;i++,j++)
{
for(k=i;k<n;k++) if(a[k][j]) break;
if(k==n)
{
i--;
continue;
}
for(t=j;t<=m;t++) swap(a[k][t],a[i][t]);
for(k=i+1;k<n;k++) if(a[k][j])
{
for(t=j;t<=m;t++) a[k][t]^=a[i][t];
}
}
for(k=i;k<n;k++) if(a[k][m]) return 0;
return 1;
}
int main()
{
RD(n);
int i,j,k;
i64 x,ans=0;
FOR0(i,n)
{
RD(x);
for(j=63;j>=0;j--)
{
b[j][i]=x&1;
x>>=1;
}
}
for(i=0;i<64;i++)
{
p[i]=1;
for(j=0;j<=i;j++)
{
for(k=0;k<n;k++) a[j][k]=b[j][k];
a[j][n]=p[j];
}
p[i]=Gauss(i+1,n,a);
ans=ans*2+p[i];
}
PR(ans);
return 0;
}