题目描述 babab是个喜欢位运算的孩子。
今天,她需要计算 n 个整数的异或和 a 1 ⊕ a 2 ⊕ ⋯ ⊕ a n a 1 ⊕a 2 ⊕⋯⊕a n 。
为了更方便地计算,她决定先将式子抄写到草稿纸上。但在抄写到某个符号的时候,她的圆珠笔突然没水了!于是,恰好一个异或符号 ⊕ 被抄成了加法符号 +。
可怜的 dXqwq 并没有注意到这一点,她仍然按照从左到右的方式计算了式子的值,也就是 ( ( ( ( ( ( a 1 ⊕ a 2 ) ⊕ a 3 ) ⊕ ⋯ ) + a x ) ⊕ a x + 1 ) ⊕ ⋯ ) ⊕ a n ((((((a 1 ⊕a 2 )⊕a 3 )⊕⋯)+a x )⊕a x+1 )⊕⋯)⊕a n 。
现在她决定将错就错:她希望你算出所有可能的算式的最小值和最大值,来帮她检查她是否还在计算中犯了更多的错误。
输入格式 从文件 mistake.in 中读入数据。
第一行输入一个整数 n。
第二行输入 n 个整数 a i 。
输出格式 输出到文件 mistake.out 中。
输出一行两个整数,分别代表可能得到结果的最小值和最大值。 2≤n≤10^5,0≤ai<2^31
#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>
using namespace std;
int main() {
int n;
cin >> n;
freopen("mistake.in", "r", stdin);
freopen("mistake.out", "w", stdout);
vector<int> a(n);
for (int i = 0; i < n; ++i) {
cin >> a[i];
}
vector<int> pre(n + 1);
for (int i = 0; i < n; ++i) {
pre[i + 1] = pre[i] ^ a[i];
}
int max_result = INT_MIN;
int min_result = INT_MAX;
for (int x = 0; x < n; ++x) {
int left_xor = pre[x];
int right_xor = pre[n] ^ pre[x + 1];
int current_result = left_xor + a[x] ^ right_xor;
max_result = max(max_result, current_result);
min_result = min(min_result, current_result);
}
cout << min_result << " " << max_result << endl;
return 0;
}
//逆天马蜂见谅