
思路:
通过题目可以得出结论
b1^b2=a1
b2^b3=a2
.......
bn-1^bn=an-1
所以就可以得出
(b1^b2)^(b2^b3)=a1^a2
b1^b3=a1^a2
有因为当确定一个数的时候就可以通过异或得到其他所有的数,且题目所求的是一个n-1的全排列
那么求出a的前缀异或和arr之后就得到bi=b1^arri
实际上实在寻找一个 b1 使得异或出来的所有值越小越好,所以拆位,假设所有数字的第 i位为 1 的个数大于为 0 的个数,那我们最好异或上一个 2^i,这样可以使大部分数字变小。
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- //#include
- #include
- #include
- #include
- #include
- #define dbug cout<<"*****hear*****"<
- #define rep(a,b,c) for(ll a=b;a<=c;a++)
- #define per(a,b,c) for(ll a=b;a>=c;a--)
- #define no cout<<"NO"<
- #define yes cout<<"YES"<
- #define endl "\n"//交互题一定要关!!!!!!!!!
- #define lowbit(x) (x&-x)
- #define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
- //priority_queue
,greater >q; - using namespace std;
- typedef long long ll;
- typedef long double ld;
- typedef pair
PII; - typedef pair<long double,long double> PDD;
- ll INF = 0x3f3f3f3f;
- //const ll LINF=LLONG_MAX;
- // int get_len(int x1,int y1,int x2,int y2)
- // {
- // return (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1);
- // }
- const ll N = 2e5+ 10;
- const ll mod1 =998244353;
- const ll mod2 =1e9+7;
- // const ll hash_num = 3e9+9;
- ll n,m,ca;
- ll arr[N],brr[N],crr[N],drr[N];
- //ll h[N],ne[N],e[N],w[N],book[N],idx;
- //ll idx;
-
- // void add(ll a, ll b , ll c)
- // {
- // e[idx] = b, w[idx] = c,ne[idx] = h[a], h[a] =idx ++ ;
- // }
-
-
- void solve()
- {
- cin >> n;
- arr[0]=0;
- rep(i,1,n-1)
- {
- cin >> arr[i];
- arr[i] ^= arr[i-1];
- }
- ll ans=0;
- rep(i,0,20)
- {
- ll sum1=0;
- ll sum2=0;
- rep(j,0,n-1)
- {
- if(arr[j]>>i&1)sum1++;
- else
- {
- sum2++;
- }
- }
- if(sum1>sum2)ans|=1<
- }
- rep(i,0,n-1)arr[i]^=ans;
- rep(i,0,n-1)cout << arr[i]<<' ';
- }
-
-
- int main()
- {
- IOS;
- ll _;
- _=1;
- //scanf("%lld",&_);
- //cin>>_;
-
- ca=1;
- while(_--)
- {
- solve();
- ca++;
- }
- return 0;
- }