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;
}

 京公网安备 11010502036488号
京公网安备 11010502036488号