一开始沉迷与突然奇怪起来的画风,觉得反正n到,直接计数或者往桶里面仍就好啊。后来马老师突然:我发现了华点。。。4MB卡空间,直接否了我一开始的想法,但注意到k=1/2,对于k=1可以直接异或,本来觉得k=1是个特殊情况,但是过一段时间(想了整整1个小时)才发现啊,k=1就像是数学大题里的第一问一样,起的是提醒作用qwq
比较美妙的地方有两个:想到4MB很可能会卡万能头(24OJ留下的深刻阴影);没整幺蛾子乖乖从1-31拆位(上次卡牌选取拆位挂五十分留下的深刻阴影)
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
int n,k,ans,a[31],flag;
int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
signed main()
{
freopen("sort.in","r",stdin);
freopen("sort.out","w",stdout);
n=read(),k=read();
if(k==1)
{
for(int i=1;i<=n;i++)
{
int x=read();
ans^=x;
}
printf("%d",ans);
return 0;
}
for(int i=1;i<=n;i++)
{
int x=read();
for(int j=31;j>=0;j--) if((1<<j)&x) a[j]^=x;
flag^=x;
}
for(int i=31;i>=0;i--)
{
if((1<<i)&flag)
{
printf("%d %d",flag^a[i],a[i]);
return 0;
}
}
return 0;
}