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