C
题意:
就是给你一个m位的数,然后给你一个数组,对于每个元素你要么同或要么异或。同或就是相同为1不同为0。
思考:
看到感觉是贪心一下,按最高位来,如果同或更好就同或,否则就异或。但是不对,是有后效性的。所以有个结论就是同或就是异或后取反。所以所有的数肯定先异或起来,但是其中有些是取反的,由于异或两次相同的数就相当于不变,所以最后取反一次就行了。对于取反可以暴力一遍,也可以直接now^(1ll<<m-1)。对于达到63和64位的要开ull了。
代码:
int T,n,m,k;
int va[N];
int ksm(int a,int b)
{
int sum = 1;
while(b)
{
if(b&1) sum = sum*a;
a = a*a;
b >>= 1;
}
return sum;
}
signed main()
{
IOS;
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>va[i];
int ans = ksm(2,m)-1;
int sum = 0;
for(int i=1;i<=n;i++) sum ^= va[i];
cout<<max(sum,sum^ans);
return 0;
}
总结:
多多积累经验呀,多尝试尝试,猜一猜。