题目大意:

输入n个数字,每个数字是长度为k的二进制数。现在每输入一个数,可以选择与上一次的结果进行同或或者是异或,问最大的结果。

思路:

显然dp是不行的。因为具有后效性。

没想到是个结论题,首先是可以发现同或的性质:同或=异或以后按位取反

那么我们可以将所有的数先异或起来。然后我们需要知道哪些数字需要按位取反。

这里需要知道一个知识点就是:对于一个二进制数x,按位取反 = x xor (2k12^k-1)

由于相同的数字异或结果为0。因此我们只要知道2k12^k-1的个数是偶数还是奇数就可以了。

因此答案就是:max(异或前缀和,异或前缀和 xor (2k1)(2^k-1) )

由于k=64,2642^{64}会爆longlong ,需要开unsigned long long

代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,k;
    unsigned long long x,ans=0;
    cin>>n>>k;
    for(int i=1;i<=n;i++){
        cin>>x;
        ans^=x;
    }
    cout<<max(ans,ans^((1ull<<k-1)-1+(1ull<<k-1)))<<endl;
}