#1509 : 异或排序
时间限制: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
思路:两个二进制数字,比如 101001 100101 ,要使得XOR一个数字,保证小于等于,那么对于从大到小的位置,XOR后都是相等的,如果不相等的那个位置,前为0 ,后为 1,这个位置肯定要为 0,反之亦然,枚举一遍,看是否
会有冲突,为0,否则为1<<那些可以任意的位置1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 5 ll a[70]; 6 int b[70]; 7 8 int main(){ 9 int n; 10 for(int i=0;i<=60;i++) b[i]=-1; 11 scanf("%d",&n); 12 for(int i=1;i<=n;i++) scanf("%lld",&a[i]); 13 for(int i=2;i<=n;i++){ 14 for(int j=59;j>=0;j--){ 15 if((a[i]^a[i-1])&((1LL)<<j)){ 16 if(a[i]&((1LL)<<j)){ 17 if(b[j]==-1) b[j]=0; 18 else if(b[j]==1){ 19 cout<<0<<endl;return 0; 20 } 21 } 22 else { 23 if(b[j]==-1) b[j]=1; 24 else if(b[j]==0){ 25 cout<<0<<endl;return 0; 26 } 27 } 28 break; 29 } 30 } 31 } 32 ll sum=1; 33 for(int i=0;i<=59;i++){ 34 if(b[i]==-1) sum<<=1; 35 } 36 cout<<sum<<endl; 37 return 0; 38 }