题目
我们发现,一个组里面要么只有一个整数,要么只有两个整数。因为如果一个组里面有三个整数,其中第一个和第二个满足条件,第一个和第三个满足条件,那么第二个就会和第三个相等,就会产生矛盾。所以一个组里面最多两个数。
我们对于每一个整数,如果在它之前有和它符合条件的数,那么就让这个数和之前的那个数抵消。否则,就让这个数单独成为一个组。这个题有很多种解法,我曾经用了字典树,然后炸了,所以推荐写 map,因为字典树不好重置,你要把指针数组也重置。map 很简单,一个 clear()
完事。
还有,存数时,直接存这个数反过来的数就行了,这样方便查询,至于如何反过来,你可以把这个数异或上 (1 << 31) + 1
,请自行思考原因。
AC Code:
#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <list>
#include <set>
#include <map>
using namespace std;
int t;
int n, a[200100];
map<int, int> m;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> t;
while (t--) {
cin >> n;
m.clear();
int ans = 0;
for (int i = 1; i <= n; i ++) {
cin >> a[i];
if (!m[a[i]]) {
ans++;
m[((1 << 31) - 1) ^ a[i]] += 1;
}
else m[a[i]]--;
}
cout << ans << '\n';
}
return 0;
}