ORIGIN PROBLEM

题目大意

就是给你一个数 x , 两种操作,最后必须让x = 2n - 1 { n | n >= 0 }

  • 奇数操作 x xor 2n - 1
  • 偶数 x + 1

然后让你给出每次奇数操作的数

我写的是模拟,每次 xor 除后缀的最低位的连续0的最高位的 0 的位置 n 2n - 1
比如 110100100 就是 xor 11111 值得一提的是官方题解是有bfs版本的,看了下代码风格很奇葩,但不算丑(根本很难看下去啊喂
整体思路好像貌似就是暴力搜一遍..(说实话他的代码是真的恶心到我了 口区

#include <bits/stdc++.h>

using namespace std;

inline int lowbit(int x) {
    return x&-x;
}
inline bool is2(int x) {
    x += 1;
    return (x&-x) == x;
}
int log2(int x) { //编译参数好像出了点问题就手写了一个
    int i = 0;
    for (i = 0; x != 0; i++) {
        x /= 2;
    }
    return i;
}
int hight0(int x) {
    for (int i = 0; x != 0 ; i++) {
        if (lowbit(x) == (1 << i)) 
            x ^= (1 << i);
        else return lowbit(x) - 1;
    }
    return 0;
}
int n;
queue<int> ans;
int main() {
    cin >> n;
    int i = 0;
    for (i = 0; !is2(n); i++) {
        if (i % 2 == 0) {
            int op = hight0(n);
            ans.push(op);
            n ^= op;
        } else n += 1;
    }
    if (ans.size() == 0) {
        cout << "0" << endl;
        return;
    }
    cout << i << endl << log2(ans.front() + 1) - 1; ans.pop();
    while(!ans.empty()) { 
        cout << " " << log2(ans.front() + 1) - 1;
        ans.pop();
    }
}

最后分享一种魔鬼写法

#include <bits/stdc++.h>

using namespace std;

int x;
vector<int> ans; 
int main() { 
    cin >> x;
    int len = 32 - __builtin_clz(x);
    ans.push_back(0); //都跟样例不一样233
    for (int i = 0; i < len; i++) {
        int last = (x >> i) & 1;
        if (last == 0) ans.push_back(i);
    } 
    cout << ans.size() * 2 - 1 << '\n';
    for (int i : ans) cout << i << " ";
    return 0;
}