要求or的值最大,从高位到低位贪心,高位尽量为0,所以要求优先满足高位每段的xor和都相等
转化为前缀和就是选出0的个数能否>=m
#include<cstdio>
using namespace std;
int vis[1000005];
long long a[1000005],Sum[1000005];
int main(){
int n,m;
scanf("%d%d",&n,&m);
for (int i=1; i<=n; i++){
scanf("%lld",&a[i]);
Sum[i]=Sum[i-1]^a[i];
}
long long ans=0;
for (int i=62; i>=0; i--){
int sum=0;
for (int j=1; j<=n; j++)
if (!vis[j] && (Sum[j]&(1ll<<i))==0) sum++;
if (sum>=m && !(Sum[n]&(1ll<<i))){
for (int j=1; j<=n; j++)
if (Sum[j]&(1ll<<i)) vis[j]=1;
}
else ans|=1ll<<i;
}
printf("%lld
",ans);
return 0;
}