为了a异或b的和最大,只需另b在不大于n的情况下按位取反即可。
这里有两个输出小技巧可以参考:
1.在用printf输出__int64时,在windows下使用格式"%I64d",在linux下使用"%lld",在hdu中应使用"%I64d",如果拿不准就是用cout好了。
2.在遇到每个数之间有空格,最后一个数后面是换行时可以使用这个小技巧:
for (int i = 0; i < n; i++ ) printf("%d%c", a[i], (i == n-1? ' ' : ' '));
完整代码如下:
1 #define MAXN 100005 2 #include <stdlib.h> 3 #include <iostream> 4 #include <stdio.h> 5 using namespace std; 6 int arr[MAXN]; 7 int ans[MAXN]; 8 bool vis[MAXN]; 9 int n; 10 void solve() 11 { 12 for( int i = n-1 ; i >= 0 ; i-- ) 13 { 14 if( vis[i] == 0 ) 15 { 16 int bit = 1; 17 while(bit <= i) 18 { 19 bit <<= 1; 20 } 21 ans[bit-1-i] = i; 22 ans[i] = bit - 1 - i; 23 vis[i] = vis[bit-1-i] = 1; 24 } 25 } 26 printf("%I64d ", 1ll * n * (n-1)); 27 //cout<<1ll * n *(n-1)<<endl; 28 for( int i = 0 ; i < n ; i++ ) 29 { 30 printf("%d%c",ans[arr[i]], (i == n-1? ' ' : ' ')); 31 } 32 fill(vis, vis+MAXN, 0); 33 } 34 int main(int argc, char *argv[]) 35 { 36 while(scanf("%d", &n) != EOF) 37 { 38 n++; 39 for( int i = 0 ; i < n ; i++ ) 40 { 41 scanf("%d", &arr[i]); 42 } 43 solve(); 44 } 45 }