0
点赞
收藏
分享

微信扫一扫

牛客练习赛88-踩不出足迹-(位运算结论)

elvinyang 2022-03-31 阅读 48
算法

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;
}

总结:
多多积累经验呀,多尝试尝试,猜一猜。

举报

相关推荐

0 条评论