codeforces
1174D - Ehab and the Expected XOR Problem

题意
让你构造一个数列A 使他任何一个子段异或值不能是0 也不能是 x
同时使他最长

这里我们考虑 优先构造一个数列A 的前缀异或和 B数列
那么 A[ i ] = B[ i ] ^ B [ i - 1 ];

我们首先考虑 如果想要尽可能的长同时不出现 0 和 x 那样的话
我们构造数列B 的时候就最好只选取 i ^ x 和 i 中的 仅一个 那样就保证了 我们异或的时候不会出现 x

由于我们 只能选 这异或里面的一半数据 所以 最后l最长 是 2^(n-1)

由于 B 里面相邻每位都是不同的 所以自然不会出现 0

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define fastio ios::sync_with_stdio(false);cin.tie(0)
const int maxn = 2e5 + 5;

int n, x;

bool vis[1 << 18];

signed main() {
    fastio;
    cin >> n >> x;
    int pre = 0;
    vector<int> ans;
    vis[x] = 1; // x 不能出现
    ans.push_back(0);
    for(int i = 1; i < (1 << n); i ++) {
        if(vis[i])
            continue;

        vis[i] = vis[i ^ x] = 1; // 优先选取 成对出现的一个
        ans.push_back(i); // 现在构成 a的前缀异或和数组
    } // 那样 a[i] = b[i + 1] ^ b[i];

    cout << ans.size() - 1 << endl;

    for(int i = 1; i < ans.size(); i ++) {
        cout << (ans[i] ^ ans[i - 1]) << " ";
    }cout << endl;
    return 0;
}