/*
题意:a, b两个序列,规定由[0, n]区间的数!
求 a[i] ^ b[i] 的和最大!
思路:如果数字 n的二进制有x位, 那么一定存在一个数字m,使得n^m的所有二进制位
都是1,也就是由x位1!这样下去的到的值就是最大值!
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define N 100005
using namespace std;
int b[N], vis[N];
int pos[N];
int main(){
int n;
while(scanf("%d", &n)!=EOF){
int x, y;
for(int i=0; i<=n; ++i){
scanf("%d", &x);
pos[x]=i;
}
memset(vis, 0, sizeof(vis));
long long sum=0;
for(int i=n; i>=0; --i){
y=x=i;
if(vis[x]) continue;
int tmp=1;
while(y){
x^=tmp;
tmp<<=1;
y>>=1;
}
vis[x]=vis[i]=1;
sum+=2*(x^i);
b[pos[i]]=x;
b[pos[x]]=i;
}
//printf("%lld\n", sum);
cout<<sum<<endl;
printf("%d", b[0]);
for(int i=1; i<=n; ++i)
printf(" %d", b[i]);
printf("\n");
}
return 0;
}
时间: 2024-09-25 02:12:34