又是神仙题。
不过发现1900分的题很多都是转化为前缀(后缀)和数组来解决问题的
A数组不好构造,考虑构造A的前缀异或数组s
那么有ai?=si??si?1?
那么现在就是看这个s数组的限制
Ⅰ.异或后值域不变,所以s数组也取[1,1<<n)
Ⅱ.由于不出现子段异或和为0,所以s数组中任意元素不相等
换言之,[1,1<<n)中的数最多用1次
Ⅲ.若s数组出现了si?,就不能出现si??x,这就保证没有字段异或为x
那么,由于选w,就会删去w?x
且对于不同的w,删去的w?x都是不同的
说明,[1,1<<n)中的元素我们可以选一半
#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
#define quickly ios::sync_with_stdio(false)
bool vis[1<<18];
int n,x;
vector<int>ans;
int main()
{quickly;cin >> n >> x;vis[x]=1;ans.push_back(0);for(int i=1;i< (1<<n) ;i++){if( vis[i] ) continue;ans.push_back(i);//选i,就不能选i^xvis[i]=vis[i^x]=1; }cout << ans.size()-1 << endl;for(int i=1;i<ans.size();i++) cout << ( ans[i]^ans[i-1] ) << " ";return 0;
}