hihoCoder.1509.异或排序(位运算 思路)

Posted sovietpower

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hihoCoder.1509.异或排序(位运算 思路)相关的知识,希望对你有一定的参考价值。

题目链接

(Description)

给定长为(n)的序列(A)。求有多少(S),满足(0leq S<2^{60}),且对于所有(iin[1,n-1])(a[i]^{wedge}Sleq a[i+1]^{wedge}S)
(nleq20)

(Solution)

考虑对于(a,b),有哪些(S)满足(a^{wedge}Sleq b^{wedge}S)
找出(a^{wedge}b)的最高位(1)(也就是(a,b)不同的最高位),如果这一位(a)(0)(b)(1),那么(S)这一位必须是(0);否则(S)这一位必须是(1)
所以每个(a[i]^{wedge}Sleq a[i+1]^{wedge}S)实际上是限制了(S)的某一位。把所有限制算出来就行了。

//0ms   0MB
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define gc() getchar()
#define BIT 59
typedef long long LL;
const int N=66;

int ban[N];

inline LL read()
{
    LL now=0;register char c=gc();
    for(;!isdigit(c);c=gc());
    for(;isdigit(c);now=now*10+c-'0',c=gc());
    return now;
}

int main()
{
    memset(ban,0xff,sizeof ban);
    int n=read(); LL las=read();
    for(int i=2; i<=n; ++i)
    {
        LL now=read(),s=now^las;
        for(int j=BIT; ~j; --j)
        {
            if(!(s>>j&1)) continue;
            if(las>>j&1)
                if(!ban[j]) return puts("0"),0;
                else ban[j]=1;
            else
                if(ban[j]==1) return puts("0"),0;
                else ban[j]=0;
            break;
        }
        las=now;
    }
    LL ans=1;
    for(int i=BIT; ~i; --i) if(ban[i]==-1) ans<<=1ll;
    printf("%lld
",ans);

    return 0;
}

以上是关于hihoCoder.1509.异或排序(位运算 思路)的主要内容,如果未能解决你的问题,请参考以下文章

Leecode位运算与堆排序

[位运算]签到题

位运算之异或运算

位运算符-异或^

Java位运算:位异或运算位与运算位或运算位取反运算左位移运算右位移运算无符号右移运算不用额外变量交换两个整数的值(使用位异或运算)

位运算 : 巧妙使用异或(^)