HDU -- 5014 Number Sequence
来源:互联网 发布:最贵的域名 编辑:程序博客网 时间:2024/05/02 04:56
Problem Description
There is a special number sequence which has n+1 integers. For each number in sequence, we have two rules:
● ai ∈ [0,n]
● ai ≠ aj( i ≠ j )
For sequence a and sequence b, the integrating degree t is defined as follows(“⊕” denotes exclusive or):
t = (a0 ⊕ b0) + (a1 ⊕ b1) +···+ (an ⊕ bn)
(sequence B should also satisfy the rules described above)
Now give you a number n and the sequence a. You should calculate the maximum integrating degree t and print the sequence b.
● ai ∈ [0,n]
● ai ≠ aj( i ≠ j )
For sequence a and sequence b, the integrating degree t is defined as follows(“⊕” denotes exclusive or):
(sequence B should also satisfy the rules described above)
Now give you a number n and the sequence a. You should calculate the maximum integrating degree t and print the sequence b.
Input
There are multiple test cases. Please process till EOF.
For each case, the first line contains an integer n(1 ≤ n ≤ 105), The second line contains a0,a1,a2,...,an.
For each case, the first line contains an integer n(1 ≤ n ≤ 105), The second line contains a0,a1,a2,...,an.
Output
For each case, output two lines.The first line contains the maximum integrating degree t. The second line contains n+1 integers b0,b1,b2,...,bn. There is exactly one space between bi and bi+1(0 ≤ i ≤ n - 1). Don’t ouput any spaces after bn.
Sample Input
42 0 1 4 3
Sample Output
201 0 2 3 4</pre><br /><br /><p></p>
题意:
给出的 0 - n 之间的数字,求出它们异或的和的最大;
任意的数字 ,例如 0 1 0 1,以其异或的值最大是 1 0 1 0;
因此 我们就 可以通过 0 1 0 1 异或 1 1 1 1 得到 1 0 1 0;
那么就可以求出各自对应的值;
#include <iostream>#include <cstring>#include <cstdio>#include <cmath>#define ll __int64#define N 100005using namespace std;int a[N];int vis[N];int b[N];int main() { int n; while (scanf("%d",&n) != EOF) { memset(a,0,sizeof(a)); memset(vis,0,sizeof(vis)); memset(b,0,sizeof(b)); for (int i = 0; i <= n; i++) scanf("%d",&a[i]); for (int i = n; i > 0; i--) { // 逆序 if (vis[i] == 0 ) { int d = log2(i) + 1 ; // 为了求出求位数,例如 i = 8 ;d = 4
int t1 = ((1 << d) - 1);// 位数减去1,可以得到该位数的11……1; t1 = 15 ;(111)
int t = t1 ^ i; //求出与他异或的值 b[i] = t; b[t] = i; vis[i] = 1; vis[t] = 1; } } ll sum = 0; for (int i = 0; i <= n; i++) sum += i ^ b[i]; printf("%I64d\n",sum); for (int i = 0; i < n; i++) printf("%d ",b[a[i]]); printf("%d\n",b[a[n]]); }}
0 0
- HDU 5014 Number Sequence
- HDU - 5014 Number Sequence
- HDU-5014-Number Sequence
- HDU 5014 Number Sequence
- HDU -- 5014 Number Sequence
- hdu 5014 Number Sequence
- HDU 5014-Number Sequence
- HDU 5014 Number Sequence
- hdu 5014 Number Sequence
- HDU -- 5014 Number Sequence
- HDU 5014Number Sequence
- Number Sequence(hdu 5014)
- hdu 5014 Number Sequence
- hdu 5014 number sequence 贪心
- hdu 5014 Number Sequence(贪心)
- hdu 5014 Number Sequence(贪心)
- 贪心-HDU 5014Number Sequence
- HDU 5014 Number Sequence(分类模拟)
- union find并查集 (algorithm course Of Princeton )
- 在c++中,vector的用法
- JAX-RS Simple SSE Sample
- hdu 5023(2014广州网赛1002) A Corrupt Mayor's Performance Art
- hdu 5024 Wang Xifeng's Little Plot【暴力dfs,剪枝】
- HDU -- 5014 Number Sequence
- poj 5024&&&2014 ACM/ICPC Asia Regional Guangzhou Online 1003(预处理)
- 耗子问题
- 假如Myclass为一类,执行Myclass a[3],*p[2];语句时会自动调用该类构造函数几次
- java按钮和面板的用户界面
- iOS7系列设备开发参数
- C++编译出现error C4996的解决方法
- HDU 5025 Saving Tang Monk
- 签约华为