数组部分异或和与前缀疑惑和之间的关系(a为原数组,b为a的前缀异或和数组):
al^al+1^al+2^^^ar=bl-1^br
因此题目中不允许al^al+1^^^ar等于x且不可等
于0,因此就可转换为bi^bj=0且bi^bj=x不可出现。
再转换一下,就可以得到bi或者bi^x只能出现一次。
同时bi也不能等于x。
#include<bits/stdc++.h>
using namespace std;
map<int,int>vis;
vector<int>v;
int main()
{
int n,x;
cin>>n>>x;
vis[x]=1;
for(int i=1;i<(1<<n);i++)
{
if(!vis[i])
{
vis[i^x]=1;
v.push_back(i);
//printf("%d\n",i);
}
}
if(v.size()==0){
puts("0");
return 0;}
printf("%d\n%d ",v.size(),v[0]);
for(int i=1;i<v.size();i++)
{
printf("%d ",v[i]^v[i-1]);
}
return 0;
}