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<<'\n';
    return 0;
}

 

posted @ 2017-04-26 07:34  神犇(shenben)  阅读(452)  评论(0编辑  收藏  举报