Hihocoder #1509 : 异或排序

#1509 : 异或排序

http://hihocoder.com/problemset/problem/1509

分析:

  如果a[i]和a[i+1]的相同的位,那么可以不用考虑了,找到它们第一个不同的位置,它限制了S的这个位置必须是多少。

  最后答案就是没有限制的位的随便选。如果一个位限制了两次,且数字不同,那么答案就是0。

  dls:别看n只有几十,但是它的复杂度是nlog(max{ai})!!!

代码:

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<iostream>
 6 #include<cctype>
 7 #include<set>
 8 #include<vector>
 9 #include<queue>
10 #include<map>
11 #define fi(s) freopen(s,"r",stdin);
12 #define fo(s) freopen(s,"w",stdout);
13 using namespace std;
14 typedef long long LL;
15 
16 inline LL read() {
17     LL x=0,f=1;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1;
18     for(;isdigit(ch);ch=getchar())x=x*10+ch-'0';return x*f;
19 }
20 
21 const int N = 100;
22 
23 LL a[N], b[N];
24 
25 int main() {
26     
27     int n = read();
28     for (int i=1; i<=n; ++i) a[i] = read();
29     
30     memset(b, -1, sizeof(b));
31     
32     for (int i=1; i<n; ++i) {
33         for (int j=59; j>=0; --j) {
34             int t1 = (a[i] >> j) & 1, t2 = (a[i + 1] >> j) & 1;
35             if (!t1 && t2) { // 0 1
36                 if (b[j] == -1 || b[j] == 0) { b[j] = 0; break; }
37                 else { cout << 0; return 0; }
38             }
39             if (t1 && !t2) { // 1 0
40                 if (b[j] == -1 || b[j] == 1) { b[j] = 1; break; }
41                 else { cout << 0; return 0; }
42             }
43         }
44     }
45     
46     LL cnt = 0;
47     for (int j=59; j>=0; --j) 
48         if (b[j] == -1) cnt ++;
49     cout << (1ll << cnt);
50     return 0;
51 }

 

posted @ 2018-10-09 11:21  MJT12044  阅读(169)  评论(0编辑  收藏  举报