hdu5014Number Sequence 位运算

来源:互联网 发布:贵州行知科技职业学校 编辑:程序博客网 时间:2024/06/03 20:07
//给出长度为n+1的序列 a 其中0<=ai<=n且ai != aj (i != j)//找出满足同样条件的序列b使得//t = (a[0]^b[0]) + (a[1]^b[1]) + ... + (a[n]^b[n]) 最大//由于a和b的序列的长度都是确定的//从n到0的数//每个数i找一个从其最高位开始按位非的数j//由于对应位置最高位为0,所以j<=i//对于每一个数i其对应的j各不相同 , 所以b能满足条件#include<cstdio>#include<cstring>#include<iostream>using namespace std ;const int maxn = 1e5+10 ;int a[maxn] ;int vis[maxn] ;typedef long long ll ;int get(int n){    int pos = 0  ;    int sum = 0  ;    while(n)    {        if(n%2 == 0)sum += (1<<pos) ;        n/=2 ;        pos++ ;    }    return sum ;}int main(){    //freopen("in.txt" ,"r" , stdin) ;    int n ;    while(~scanf("%d" , &n))    {        memset(vis , 0 , sizeof(vis)) ;       for(int i = n ;i >= 0;i--)       {            if(vis[i])continue ;            int t = get(i) ;            vis[t] = i ;            vis[i] = t  ;        }        int tmp;        cout<<((ll)n*(n+1))<<endl;        int ans = 0 ;        for(int i = 0;i <= n;i++)        {            scanf("%d" , &tmp)  ;            printf("%d%c" , vis[tmp] , i == n ?'\n':' ') ;        }    }    return 0  ;}

0 0