• hihoCoder挑战赛28 题目1 : 异或排序


    题目1 : 异或排序

    时间限制:10000ms
    单点时限:1000ms
    内存限制:256MB

    描述

    给定一个长度为 n 的非负整数序列 a[1..n]

    你需要求有多少个非负整数 S 满足以下两个条件:

    (1).0 ≤ S < 260

    (2).对于所有 1 ≤ i < n ,有 (a[i] xor S) ≤ (a[i+1] xor S)

    输入

    第一行一个正整数 n

    第二行 n 个非负整数表示序列 a[1..n]

    1 ≤ n ≤ 50

    0 ≤ a[i] < 260

    输出

    一个非负正数,表示答案

    样例输入
    3
    1 2 3
    样例输出
    288230376151711744
    /*
        Name: xor sort
        Copyright:@2017 shenben 
        Author: shenben
        Date: 25/04/17 15:32
        Description: 
    // a[i] xor a[i+1] = (a[i] xor S) xor (a[i+1] xor S)
    // 假如a[i] xor a[i+1]的是1的最高位是第k[i]位
    // 只需判断a[i] xor S的第k[i]位,是0则S满足,是1则S不满足
    // 所以符合要求的S必须满足对于所有1 <= i < n,有S的第k[i]位与a[i]的第k[i]位相同
    */
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<iostream>
    using namespace std;
    typedef long long ll;
    template <typename T>
    inline void read(T &x){
        T f=1;char ch=getchar();x=0;
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        x*=f;
    }
    const int N=65;
    int n;ll a[N];short k[N];
    inline void make(int x,int y){
        if(k[x]==-1) k[x]=y;else
        if(k[x]!=y){puts("0");exit(0);}
    }
    int main(){
        read(n);memset(k,-1,sizeof k);
        for(int i=1;i<=n;i++) read(a[i]);
        for(int i=1;i<n;i++){
            ll p=a[i]^a[i+1];
            for(int j=59;~j;j--){
                if(p&(1LL<<j)){
                    make(j,(a[i]>>j)&1);
                    break;
                } 
            }
        }
        ll ans=1;
        for(int i=0;i<60;i++) if(k[i]==-1) ans<<=1;
        cout<<ans<<'
    ';
        return 0;
    }
  • 相关阅读:
    hdu1089
    hdu1088
    驴妈妈
    途牛悄然上市 登陆SEC途牛前景如何
    途牛旅游网
    百度-----携程
    携程旅行网
    手机游戏
    web
    改造 改革
  • 原文地址:https://www.cnblogs.com/shenben/p/6766754.html
Copyright © 2020-2023  润新知