CodeForces.1174D.EhabandtheExpectedXORProblem(構造前綴異或和數組)

  題目連接數組

這道題比賽的時候沒作出來,賽後補題的時候發現其實能夠構造一個前綴異或和數組,而後根據初始化的第一個值進行填數,可是做爲菜雞的我雖然堅信本身的想法是正確的卻想了好久也沒有可以構造出來所謂的前綴異或和數組。唉,嚶嚶嚶spa

  本題思路:咱們能夠根據這個構造一個前綴異或和數組,由ans[ i ] ^ ans[ i - 1 ]就能夠獲得數組裏第i個元素的值。code

  如何構造這個前綴數組呢,咱們暫時把咱們構造的前綴數組叫作b,最後輸出的答案數組稱做a,那麼咱們能夠知道,a [ l ] ^ a[l + 1] ^ .... ^ a[ r ] = b[ r ] ^ b[l - 1]。因此這個問題也就變成了,咱們要構造一個blog

前綴數組,使得任意兩個數字的異或和不爲x且每次數字只使用一次.(爲了不0的出現),因此咱們知道兩個異或和爲x的數字咱們只能選擇其中一個。get

  Can anyone explain me why it's 1 to 2^n - 1?it

#include <cstdio>
#define len 1 << n
#include <vector>
#include <algorithm>
using namespace std;

const int maxn = 1 << 18;
int value[maxn];
vector <int> ans;

int main() {
    int n, x;
    scanf("%d %d", &n, &x);
    ans.push_back(0);
    for(int i = 1; i < len; i ++) {
        if(i != x) {
            if(value[i]) continue;//只選用未標記的
            ans.push_back(i);
            value[x ^ i] = 1;//不能選擇和i異或獲得x的數字
        }
    }
    printf("%d\n", ans.size() - 1);
    for(int i = 1; i < ans.size(); i ++) {
        if(i > 1)   printf(" ");
        printf("%d", ans[i] ^ ans[i - 1]);
    }
    printf("\n");
    return 0;
}
相關文章
相關標籤/搜索