在这个问题中,我们得到两个整数L和R来表示一个范围。我们的任务是找到[L,R]范围内所有元素的异或。
让我们举个例子来了解这个问题,
输入-L = 3,R = 6
说明-3 ^ 4 ^ 5 ^ 6 =
为了解决这个问题,我们将找到R的MSB。答案的MSB将不大于R。现在,我们将找到从0到MSB的位数的奇偶校验。
现在,要找到第i个位的奇偶校验计数,我们可以看到第i个位的状态将在每第2个数字上变化。L到R范围内的所有ith位设置都相同。这样做时,会出现两种情况-
情况1(i!= 0) -检查L的第i位。如果已设置,则检查L和L + 2i之间的数字的奇偶校验计数。如果设置了L的第i位,则L为奇数,则计数为奇数,否则为偶数。现在,我们将移至R,并确定R-2i和R之间的许多元素的计数奇偶性,并采用相同的方法。
其余所有整数都不会考虑,因为它们甚至会生成设置了第i位的整数。
情况2(i = 0) -在这里,我们将不得不请看以下情况-
情况2.1 -L和R均为奇数,计数设置为第0位的整数的个数为(RL)/ 2 + 1。
情况2.2-否则,计数将舍入为(R-L + 1)/ 2个数。
显示我们解决方案实施情况的程序,
#include <iostream> using namespace std; int findMSB(int x) { int ret = 0; while ((x >> (ret + 1)) != 0) ret++; return ret; } int XOREleInRange(int L, int R) { int max_bit = findMSB(R); int mul = 2; int ans = 0; for (int i = 1; i <= max_bit; i++) { if ((L / mul) * mul == (R / mul) * mul) { if (((L & (1 << i)) != 0) && (R - L + 1) % 2 == 1) ans += mul; mul *= 2; continue; } bool oddCount = 0; if (((L & (1 << i)) != 0) && L % 2 == 1) oddCount = (oddCount ^ 1); if (((R & (1 << i)) != 0) && R % 2 == 0) oddCount = (oddCount ^ 1); if (oddCount) ans += mul; mul *= 2; } int zero_bit_cnt = zero_bit_cnt = (R - L + 1) / 2; if (L % 2 == 1 && R % 2 == 1) zero_bit_cnt++; if (zero_bit_cnt % 2 == 1) ans++; return ans; } int main(){ int L = 1, R = 4; cout<<"The XOR of all element within the range ("<<L<<", "<<R<<") is : "<<XOREleInRange(L, R); return 0; }
输出结果
The XOR of all element within the range (1, 4) is : 4