牛客寒假集训营 子段异或

74 阅读1分钟

题目传送门


思维题,如果[1,a]区间的异或和为x,[1,b]区间的异或和也为x,那么(a,b]区间的异或和为0。这样我们只需求异或前缀和就行了。


map<ll, ll> mp;
int main()
{
       ll n;
       cin >> n;
       ll sum = 0;
       ll ans = 0;
       mp[0] = 1;
       while (n--)
       {
              ll a;
              cin >> a;
              sum ^= a;
              ans += mp[sum];
              mp[sum]++;
       }
       cout << ans << endl;
       return 0;
}