/*枚举贪心
从最大的一个数开始找能使它的异或值最大的一个数。*/
#include<stdio.h>
#include<string.h>
#define N 100005
int a[N],mark[N];
int main()
{
int n,i,ans,j,sum;
long long s;
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<=n;i++)
scanf("%d",&a[i]);
memset(mark,-1,sizeof(mark));
s=0;
for(i=n;i>=0;i--)
if(mark[i]==-1)
{
ans=0;
for(j=1;ans<i;j*=2)
{
if(ans+j>=i) break;
if((i&j)==0)
ans+=j;
}
s+=(ans^i)*2;
mark[ans]=i;
mark[i]=ans;
}
printf("%I64d\n",s);
for(i=0;i<=n;i++)
{
if(i==0)
printf("%d",mark[a[i]]);
else
printf(" %d",mark[a[i]]);
}
printf("\n");
}
return 0;
}
hdu 5014
最新推荐文章于 2017-02-09 15:20:00 发布
