我必须在数组的子集元素中找到独占xor的最大值。我必须检查数组的每个子集,并且将产生最大xor的子集将是答案。
对于exapmle - 让 F(S)表示对数组 P的子集 S 的所有元素采用xor的函数= {1,2,3,4}
F({1,2}) = 3
F({1,3}) = 2
F({1,2,3}) = 0
F({1,4}) = 5
F({2,3}) = 1
F({2,4}) = 6
F({3,4}) = 7
F({2,3,4}) = 5
F({1,2,3,4}) = 4`
它们的最大值是7.因此答案是7。 (还有其他子集,但它们不值得考虑)。如果您要告诉我有关高斯消除方法,我已经在MSE的某个地方读过,但对我来说并不是很清楚。 如果高斯消除是唯一的答案,请详细说明给我,还是有一些我不知道的方法/算法?
答案 0 :(得分:12)
高斯消除是你需要的。
例如:3
个数字{9, 8, 5}
首先按递减顺序对它们进行排序并将它们转换为二进制:
9 : 1001
8 : 1000
5 : 0101
观察第一个号码。最高位是4.
现在检查4th
号码的1st
位(9)。因为它是1,xor是其余数字的数字,其中第4位是1。
9 : 1001
1 : 0001 > changed
5 : 0101
现在检查3rd
位2nd
位数(1)。当它为0时,检查以下3rd
位为1的其余数字。
数字5在3rd
位中有1。交换它们:
9 : 1001
5 : 0101 > swapped
1 : 0001 >
现在xor 5,其余数字3rd
位为1.这里不存在。所以没有变化。
现在检查2nd
位3rd
位数(1)。因为它是0并且在第二位为1的情况下没有其他数字,所以不会有任何变化。
现在检查1st
位3rd
位数(1)。当它为1时,更改1st
位为1的其余数字。
8 : 1000 > changed
4 : 0100 > changed
1 : 0001
不再需要考虑:)
现在xor整个剩余的数组{8 ^ 4 ^ 1} = 13
所以13
是解决方案:)
这就是你如何使用高斯消除来解决问题:)
这是我的C ++实现:
#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
typedef unsigned long long int ull;
ull check_bit(ull N,int POS){return (N & (1ULL<<POS));}
vector<ull>v;
ull gaussian_elimination()
{
int n=v.size();
int ind=0; // Array index
for(int bit=log2(v[0]);bit>=0;bit--)
{
int x=ind;
while(x<n&&check_bit(v[x],bit)==0)
x++;
if(x==n)
continue; // skip if there is no number below ind where current bit is 1
swap(v[ind],v[x]);
for(int j=0;j<n;j++)
{
if(j!=ind&&check_bit(v[j],bit))
v[j]^=v[ind];
}
ind++;
}
ull ans=v[0];
for(int i=1;i<n;i++)
ans=max(ans,ans^v[i]);
return ans;
}
int main()
{
int i,j,k,l,m,n,t,kase=1;
scanf("%d",&n);
ull x;
for(i=0;i<n;i++)
{
cin>>x;
v.push_back(x);
}
sort(v.rbegin(),v.rend());
cout<<gaussian_elimination()<<"\n";
return 0;
}
答案 1 :(得分:1)
我猜您是指this问题。
Gaussian Elimination是我期望从数学网站获得的算法描述。这就是Python中的算法。
def max_xor(iterable):
array = list(iterable) # make it a list so that we can iterate it twice
if not array: # special case the empty array to avoid an empty max
return 0
x = 0
while True:
y = max(array)
if y == 0:
return x
# y has the leading 1 in the array
x = max(x, x ^ y)
# eliminate
array = [min(z, z ^ y) for z in array]