要求使得a【l】到a【r】的和异或上x的值最大的x,要求出这样的x,就要求出使得结果中的1最多的x。
任何数异或0为它本身,异或1取反,因此,当a【l】到a【r】的二进制的某一位中1的个数较多时,x的这一位取0,反之取1。
知道了这个规则,我们只要计算出二进制的每一位中1或0的个数,就可以知道x的这一位取1还是0。
#include<iostream>
using namespace std;
int n,q,a[100010],s[100010][40];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int j=0;j<31;j++)
{
for(int i=1;i<=n;i++)
{
s[i][j]=s[i-1][j];
if((a[i]>>j)&1) s[i][j]++;
}
}
scanf("%d",&q);
for(int i=0;i<q;i++)
{
int l,r;
scanf("%d%d",&l,&r);
int x=0;
for(int j=0;j<31;j++)
{
if((s[r][j]-s[l-1][j])*2<r-l+1) x|=(1<<j);
}
printf("%d\n",x);
}
}