题意:
对于题目给定的A序列,问是否有一个x可以将(0~r)的排列转变成A序列,即Ai=Bi^x
题解:
首先给出一个结论,对于一个排列(0-n)而言,第i位上0的个数一定大于等于1,如0-5:
000
001
010
011
100
101
其次若x第i位上为1,我们会将0和1的数量互换
1^0=1
1^1=0
若x第i位上为0,将不会改变0和1的数量
0^1=1
0^0=0
所以我们得到如下算法:枚举每一位,统计0、1出现的个数,如果0的数量大于等于1该位上x的值为0,否则为1.
void solve() {
int l, r;
cin >> l >> r;
memset(nice, 0, sizeof nice);
for(int i = l; i <= r; i ++) {
cin >> a[i];
}
ll ans = 0;
for(int i = 0; i < 19; i ++) {
for(int j = l; j <= r; j ++) {
if((a[j] >> i) & 1) nice[i] ++;
else nice[i] --;
}
if(nice[i] > 0) ans += 1 << i;
}
cout << ans << endl;
}
HardVersion
对于困难版本,我们没有了第一个结论,于是需要另寻出路。
附上链接