1442. 形成两个异或相等数组的三元组数目

欲求a==b,即有s[i-1]s[j-1]=s[j-1]s[k];
∵有s[j-1],∴有s[i-1]=s[k];

/*
 * @lc app=leetcode.cn id=1442 lang=javascript
 *
 * [1442] 形成两个异或相等数组的三元组数目
/**
异或运算满足结合律和交换律,且任意数异或自身等于 0
找到异或的递推式=>推出Si=Sk+1
 */
var countTriplets = function(arr) {
    let s=[],n=arr.length;
    s[-1]=0;
    // 异或前缀和 s[0~n-1]
    for(let i=0;i<n;i++)
    {
        s[i]=s[i-1]^arr[i];
    }
    let ans=0;
    // 异或性质:a^b=b^c 则有a==c,所以i-1==k即可
    // for(let i=0;i<n;i++)
    // {
    //     for(let j=i+1;j<n;j++)
    //     {
    //         for(let k=j;k<n;k++)
    //         {
    //             let a=s[i-1]^s[j-1];
    //             let b=s[j-1]^s[k];
    //             if(a==b) ans++;
    //         }
    //     }
    // }
    for(let i=0;i<n;i++)
    {
        for(let k=i+1;k<n;k++)
        {
            if(s[i-1]==s[k])
            {
                ans+=k-i;
            }
        }
    }
    return ans;
};
// @lc code=end
posted @ 2021-05-18 20:13  Calculus9  阅读(68)  评论(0编辑  收藏  举报