数组的所有子集中的最大xor

时间:2014-12-14 15:04:39

标签: algorithm

我必须在数组的子集元素中找到独占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的某个地方读过,但对我来说并不是很清楚。 如果高斯消除是唯一的答案,请详细说明给我,还是有一些我不知道的方法/算法?

2 个答案:

答案 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

现在检查3rd2nd位数(1)。当它为0时,检查以下3rd位为1的其余数字。
数字5在3rd位中有1。交换它们:

9 : 1001
5 : 0101 > swapped
1 : 0001 >

现在xor 5,其余数字3rd位为1.这里不存在。所以没有变化。

现在检查2nd3rd位数(1)。因为它是0并且在第二位为1的情况下没有其他数字,所以不会有任何变化。

现在检查1st3rd位数(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]