题意:求出一个数组,使该数组跟原数组的异或和最大
思路:从把数字从大往小匹配就行了。
参考:http://www.cnblogs.com/xiaxiaosheng/p/3971820.html
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int n;
int a[100005];
int b[100005];
bool vis[100005];
typedef long long ll;
int getn(int x)
{
int ret=0;
while(x)
{
x>>=1;
ret++;
}
return ret;
}
int main()
{
// freopen("data.txt","r",stdin);
while(scanf("%d",&n)!=EOF)
{
for(int i=0;i<=n;++i)
{
scanf("%d",&a[i]);
}
memset(vis,0,sizeof(vis));
// cout<<"zzz"<<endl;
for(int i=n;i>=0;--i)
{
if(vis[i])continue;
int top=getn(i);
int ans=((1<<top)-1)^i;
b[i]=ans;
b[ans]=i;
vis[i]=vis[ans]=1;
}
ll sum=0;
for(int i=0;i<=n;++i)
{
sum+=(ll)(a[i]^b[a[i]]);
}
printf("%I64d\n",sum);
printf("%d",b[a[0]]);
for(int i=1;i<=n;++i)
{
printf(" %d",b[a[i]]);
}
puts("");
}
return 0;
}