原題連結
題解
由於題目能使 \(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;
}