题解
由于题目能使 \(a_i⊕x≤k\) 的 \(x\) 没有限制,所以我们反过来求能使其成立的x的范围
对于a,k二进制下的第i位,如果都为1,我们可以令此时的x在这一位也为一,然后i后面的位去什么都可以,然后x=0的时候也可能可以,就看后面有没有小于的
如果a为1,k为0,那么此时x只能为1
如果a为0,k为1,那么此时小于,如果x=0,i后面取什么都可以,x=1也可能可以,就看后面还有没有完全小于的
好抽象啊
code
#include<bits/stdc++.h>
using namespace std;
int ans[10000006]={0};
int main()
{
int n,k;
cin>>n>>k;
k++;
for(int i=1;i<=n;i++)
{
int a;
cin>>a;
int sum=0;
for(int i=22;i>=0;i--)
{
int x=((a>>i)&1),y=((k>>i)&1);
if(x&&y)
{
sum|=(1<<i);
ans[sum]++;
ans[sum+(1<<i)]--;
sum^=(1<<i);
}
else if(x&&!y)
{
sum|=(1<<i);
}
else if(!x&&y)
{
ans[sum]++;
ans[sum+(1<<i)]--;
sum|=(1<<i);
}
}
}
int summax=0,sum=0;
for(int i=0;i<=10000000;i++)
{
sum+=ans[i];
summax=max(summax,sum);
}
cout<<summax;
return 0;
}
标签:小于,int,EZEC,后面,P6824,sum,可乐
From: https://www.cnblogs.com/pure4knowledge/p/18114177