CF1174D Ehab and the Expected XOR Problem - 构造

Posted lrj124

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF1174D Ehab and the Expected XOR Problem - 构造相关的知识,希望对你有一定的参考价值。

题面

Given two integers (n) and (x), construct an array that satisfies the following conditions:

·for any element ai in the array, (1≤ai<2^n);
·there is no non-empty subsegment with bitwise XOR equal to (0) or (x),
·its length (l) should be maximized.

A sequence (b) is a subsegment of (a) sequence (a) if (b) can be obtained from (a) by deletion of several (possibly, zero or all) elements from the beginning and several (possibly, zero or all) elements from the end.

题意

给两个数 (n)(x),构造一个满足以下条件的序列:
·对任何序列中的元素 (a_i),1leq a_i<2^n1≤a_i<2^n$
·序列中没有非空连续子序列异或和为 (0)(x)
·序列长度 (l) 应该最大

思路

思路比较巧妙,因为元素可重复不太好搞,就考虑构造一个答案序列 (a) 的异或前缀和 (b),且 (b) 满足任意 (b_i xor b_j ot= x)(0)
因为若 (a xor b = c),则 (a xor c = b),所以从 (1) 枚举到 (2^n-1) ,每次用可行的 (i) 数加入答案并排除 (i xor x) 这个数。

代码

/************************************************
*Author        :  lrj124
*Created Time  :  2019.10.15.19:28
*Mail          :  1584634848@qq.com
*Problem       :  cf1174d
************************************************/
#include <cstdio>
const int maxn = 1<<18;
int n,x,ans[maxn];
bool vis[maxn];
int main() {
    //freopen("cf1174d.in","r",stdin);
    //freopen("cf1174d.out","w",stdout);
    scanf("%d%d",&n,&x);
    vis[0] = vis[x] = true;
    for (int i = 1;i < 1<<n;i++)
        if (!vis[i]) {
            vis[i^x] = true;
            ans[++ans[0]] = i;
        }
    printf("%d
",ans[0]);
    for (int i = 1;i <= ans[0];i++) printf("%d ",ans[i]^(i ^ 1 ? ans[i-1] : 0));
    return 0;
}

以上是关于CF1174D Ehab and the Expected XOR Problem - 构造的主要内容,如果未能解决你的问题,请参考以下文章

CF.862D.Mahmoud and Ehab and the binary string(交互 二分)

cf 1174 D Ehab and the Expected XOR Problem

CF D. Ehab and the Expected XOR Problem 贪心+位运算

CF1174F Ehab and the Big Finale

[CF959E] Mahmoud and Ehab and the xor-MST - 贪心,最小生成树

CF1174E Ehab and the Expected GCD Problem(DP,数论)