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