列表

详情


NC232861. 歇

描述

        小歇最近文思枯竭,好不容易想出来的题还和别人撞上了,他非常难受。临近比赛了,沙佬催他想题,他说“要不歇了吧”。于是沙佬给了他一个长度为n的数组,让他自行把这个数组分成m个连续区间,然后分别计算每个区间的区间异或和,最后把这些异或和取按位与。要求取到的与最大。不然就要让他不能歇。请帮助小歇算算他能取到的最大值,不然他就真的歇了。
        异或
        按位与

输入描述

第一行输入两个数
第二行输入个整数 

对于30%的数据保证
对于60%的数据保证
对于100%的数据保证

输出描述

输出一个整数代表最大值

示例1

输入:

4 2
7 7 3 7

输出:

3

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 155ms, 内存消耗: 2532K, 提交时间: 2022-02-14 20:39:00

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int n,m,a[N],b[N];
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	int res=0,sum,cnt;
	for(int i=30;i>=0;i--){
		res+=(1<<i);
		for(int j=1;j<=n;j++)
			b[j]=a[j]&res;
		sum=0,cnt=0;
		for(int j=1;j<=n;j++){
			sum^=b[j];
			if(sum==res) sum=0,cnt++;
		}
		if(sum==0&&cnt>=m&&(cnt-m)%2==0);
		else res-=(1<<i);
	}
	cout<<res<<endl;
}

上一题