XOR Sorting 题解

2018-07-29  本文已影响0人  魏宝器

题目描述:
Given a sequence a[1..n], you need to calculate how many integers S satisfy the following conditions:

(1). 0 ≤ S < 260

(2). For every i in [1,n-1] , (a[i] xor S) ≤ (a[i+1] xor S)

Input
On the first line there is only one integer n

On the second line there are n integers a[1..n]

1 ≤ n ≤ 50

0 ≤ a[i] < 260

Output
Output one integer : the answer


Sample Input
3
1 2 3
Sample Output
288230376151711744


题解:将ai与a(i+1)的十进制转换为二进制,然后比较从某个位置开始的不同,如果某个位置不同,则标记此位置。设此位置为x,则x以前的所有位数都不想关。
特此感谢任大大。


AC代码:

include<iostream>

include<algorithm>

include<cmath>

using namespace std;
long long a[60];
int aa[60];
int bb[60];
int visit[60]={0};
typedef long long ll;
int main()
{
int cnt = 0;
int n;
cin >> n;
for(int i=0;i<n;i++)
{
cin >> a[i];
}
for(int i=0;i<n-1;i++)
{
ll ax = a[i];
ll bx = a[i+1];
for(int j=0;j<60;j++)
{
aa[j] = ax%2;
ax/=2;
}
for(int j=0;j<60;j++)
{
bb[j] = bx%2;
bx /= 2;
}
for(int j=59;j>=0;j--)
{
if(aa[j]!=bb[j])
{
visit[j] = 1;
break;
}
}
}
for(int i=59;i>=0;i--)
{
if(visit[i]==1)
cnt++;
}
long long ans = (1ll<<(60-cnt));
printf("%lld",ans);
return 0;
}

上一篇下一篇

猜你喜欢

热点阅读