hihoCoder挑战赛28 题目1 : 异或排序
Posted 神犇(shenben)
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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; }
以上是关于hihoCoder挑战赛28 题目1 : 异或排序的主要内容,如果未能解决你的问题,请参考以下文章