每一位分开处理,希望可以获得所有异或的值中该位的情况.
一开始想用dp的方式,后来发现进位会使得无法处理.
所以直接用求和的方式来判断该位是否存在.
这里的方法是对所有取模,并排序,就可以用二分得到数量.
具体参看官方题解.还是很妙的.
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
#define debug(x) std::cerr << #x << " = " << (x) << std::endl
typedef long long LL;
const int MAXN = 2e5+17;
int main(int argc ,char const *argv[])
{
#ifdef noob
freopen("Input.txt","r",stdin);freopen("Output.txt","w",stdout);
#endif
int n;
cin>>n;
vector<int > a(n),b(n);
for (int i = 0; i < n; ++i)
{
cin>>a[i];
}
for (int i = 0; i < n; ++i)
{
cin>>b[i];
}
vector<int > c,d;
int ans = 0;
for (int i = 0; i <= 28; ++i)
{
c = a;
d = b;
int m = 1;
for (int k = 0; k < i ; ++k) m*=2;
for (int j = 0; j < n; ++j)
{
c[j]%=(2*m);
d[j]%=(2*m);
}
sort(c.begin(), c.end());
sort(d.begin(), d.end());
int l,r,sum=0;
for (int j = 0; j < n; ++j)
{
l = lower_bound(d.begin(), d.end(), m-c[j])-d.begin();
r = lower_bound(d.begin(), d.end(), 2*m-c[j])-d.begin()-1;
sum += (r-l+1);
l = lower_bound(d.begin(), d.end(), 3*m-c[j])-d.begin();
r = lower_bound(d.begin(), d.end(), 4*m-c[j])-d.begin()-1;
sum += (r-l+1);
}
if(sum&1) ans += m;
}
cout<<ans<<endl;
return 0;
}