Count Triplets That Can Form Two Arrays of Equal XOR

Count Triplets That Can Form Two Arrays of Equal XOR

题意

给定一个数组,求多少个三元对\((i,j,k)\)满足\(S(i,j-1)=S(j,k)\)

思路

考虑到异或前缀和,很容易想到\(O(n^3)\)的解法,然而远远不够,考虑到\(a=b\)\(a\oplus b=0\),我们可以找一个区间异或为\(0\)的区间\([i,j]\),在\([i+1,j-1]\)中任找一个数\(k\),都能使\(S(i,k)=S(k+1,j)\),这是因为\(S(i,k)\oplus S(k+1,j)=S(i,j)=0\),故\(S(i,k)=S(k+1,j)\),于是问题又转化成了求有多少个区间异或和为\(0\)的区间,即\(S(i)=S(j)\),很容易想到\(O(n^2)\)的算法。又考虑到\(i\in (i_1,i_2,...,i_m),i<k\)\(S(i,k)=0\),计算每个\(i\)对答案的贡献为\(k-i\),总的就是\(mk-\sum_{j=1}^m i_j\),于是我们考虑用字典存一下前缀和,使用unordered_map,使复杂度降为\(O(n)\)

AC代码

class Solution {
public:
    int countTriplets(vector<int>& arr) {
        int len = arr.size(), ans = 0, la = 0;
        unordered_map<int, int> cnt, sum;
        for (int i = 0; i < len; ++i) {
            if (cnt.count(la^arr[i])) {
                ans += cnt[la^arr[i]] * i - sum[la^arr[i]];
            }
            cnt[la]++;
            sum[la] += i;
            la ^= arr[i];
        }
        return ans;
    }
};
posted @ 2021-05-18 20:33  xDaniel  阅读(49)  评论(0)    收藏  举报