tilian
不太会这种题
发现找到一个数就能确定整个序列
然后转而发现 前缀异或和
b1 ^ b2 = a1
b1 ^ b3 = a2
...
我们发现要是n为偶数时能直接求出b1从而确定整个序列
而为奇数时我们无法确定b1
我们思考拆位之后 如果b1该位为0 算出真实的异或后的0 1 个数 b1该位为1 算出真实的异或后的0 1 个数
再与a1 a2 a3 该位上的0 1 个数看是否符合即可
int n,a[200010];
void solve() {
cin>>n;
for(int i=0;i<n-1;i++)cin>>a[i];
for(int i=1;i<n-1;i++)a[i]^=a[i-1];
int x=0;
for(int i=0;i<20;i++){
vector<int>cnt(2),res(2);
for(int j=0;j<n;j++)res[j>>i&1]++;
for(int j=0;j<n-1;j++)cnt[a[j]>>i&1]++;
if(cnt[1]!=res[1])x|=1<<i;
}
cout<<x<<' ';
for(int i=0;i<n-1;i++)cout<<(a[i]^x)<<' ';
}
标签:该位,Educational,157,int,个数,Codeforces,异或,b1
From: https://www.cnblogs.com/ycllz/p/17823993.html