LC 1442. Count Triplets That Can Form Two Arrays of Equal XOR

link

 a b 相等等价于 a^b=0.

则问题转换为找一对i,j  a[i]^...^a[j]=0.

class Solution {
public:
    int countTriplets(vector<int>& arr) {
        int n=arr.size();
        vector<int> pre(n+1);
        for(int i=1;i<=n;i++){
            pre[i]=pre[i-1]^arr[i-1];
        }
        int res=0;
        for(int i=0;i<=n;i++){
            for(int j=i+2;j<=n;j++){
                if(pre[i]==pre[j]){  
                    //a==b equals a^b==0
                    //pre[i]=a0^a1^...^a[i-1], pre[j]=a0^a1^...^a[j-1], if(pre[i]==pre[j]), then a[i]^a[i+1]^...^a[j-1]=0
                    //the middle index can be taken from[i+1,j-1], cnt=j-i-1
                    res+=j-i-1;
                }
            }
        }
        return res;
    }
};

那么问题转换为找到两个pre相等。假设在i处pre[i]=t, 在i之前有pre[i1]=t, pre[i2]=t, pre[i3]=t, 则总个数为 i-i1-1 + i-i2-1 + i-i3-1= n*i-n-(i1+i2+i3)=n(i-1)-(i1+i2+i3).故可以记录pre出现的次数及index之和。

class Solution {
public:
    int countTriplets(vector<int>& arr) {
        int n=arr.size();
        vector<int> pre(n+1);
        for(int i=1;i<=n;i++){
            pre[i]=pre[i-1]^arr[i-1];
        }
        int res=0;
        unordered_map<int,int> cnt;
        unordered_map<int,int> sumofIndex;
        for(int i=0;i<=n;i++){
            res+=cnt[pre[i]]*(i-1)-sumofIndex[pre[i]];
            cnt[pre[i]]++;
            sumofIndex[pre[i]]+=i;
        }
        return res;
    }
};
原文地址:https://www.cnblogs.com/FEIIEF/p/12865021.html