2014西安網路賽1008||hdu5014 二進位制
http://acm.hdu.edu.cn/showproblem.php?pid=5014
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
4
2 0 1 4 3
Sample Output
20
1 0 2 3 4
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
typedef __int64 LL;
const int N=100055;
int a[N],b[N],vis[N];
int n;
int get(int x)
{
int num=0;
while(x)
{
x>>=1;
num++;
}
return num;
}
int main()
{
while(~scanf("%d",&n))
{
for(int i=0;i<=n;i++)
scanf("%d",&a[i]);
memset(vis,-1,sizeof(vis));
for(int i=n;i>=0;i--)
{
if(vis[i]!=-1)
continue;
int x=get(i);
int tmp=((1<<x)-1)^i;
b[i]=tmp;
b[tmp]=i;
//printf("%d\n",b[i]);
vis[tmp]=1;
vis[i]=1;
}
LL sum=0;
for(int i=0;i<=n;i++)
sum+=(LL)(i^b[i]);
printf("%I64d\n",sum);
for(int i=0;i<=n;i++)
printf(i!=n?"%d ":"%d\n",b[a[i]]);
}
return 0;
}
相關文章
- 二進位制與二進位制運算
- 進位制詳解:二進位制、八進位制和十六進位制
- JavaScript 二進位制、八進位制與十六進位制JavaScript
- (二進位制)
- 二進位制
- 十進位制——二 (八、十六 )進位制
- 二進位制,八進位制,十進位制,十六進位制的相互轉換
- 【進位制轉換】二進位制、十六進位制、十進位制、八進位制對應關係
- 資訊學奧賽初賽天天練-71-NOIP2016普及組-基礎題2-進位制轉換、二進位制轉八進位制、八進位制轉二進位制、二叉樹陣列儲存、定址空間二叉樹陣列
- 二進位制、十進位制與十六進位制相互轉化
- java中二進位制、八進位制、十進位制、十六進位制的轉換Java
- 二進位制,八進位制,十進位制,十六進位制之間的轉換
- Python 進位制互相轉換(二進位制、十進位制和十六進位制)Python
- 計算機基礎進位制轉換(二進位制、八進位制、十進位制、十六進位制)計算機
- 關於十進位制網路
- 二進位制轉十進位制快速方法
- JAVA 二進位制,八進位制,十六進位制,十進位制間進行相互轉換Java
- 什麼是二進位制?二進位制如何轉換?
- 牛客網 二進位制數(進位制轉換、北郵機試)
- 2014西安網路賽1006||hdu5012 bfs
- 網路通訊4:HTTP實現二進位制傳輸HTTP
- 04 二進位制
- 大話二進位制,八進位制,十進位制,十六進位制之間的轉換
- JavaScript十進位制轉換為二進位制JavaScript
- Oracle二進位制與十進位制轉換Oracle
- 十進位制轉二進位制推導(草稿)
- [計算機基礎] 計算機進位制轉換:二進位制、八進位制、十進位制、十六進位制計算機
- 一看就懂二進位制、八進位制、十六進位制數轉換十進位制
- python進位制轉換(二進位制、十進位制和十六進位制)及注意事項Python
- Oracle中的二進位制、八進位制、十進位制、十六進位制相互轉換函式Oracle函式
- 進位制之間的轉換之“十六進位制 轉 十進位制 轉 二進位制 方案”
- 2014西安網路賽1009||hdu5015 矩陣矩陣
- 整數轉化成八進位制、十六進位制、二進位制,以及轉回
- 十進位制與二進位制互相轉換指南
- 二進位制轉十進位制快速轉換方法
- 進位制與二進位制及相關轉換
- 位,位元組,二進位制,十六進位制間的關係
- Cocoapods 二進位制