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

32 篇文章 1 订阅
24 篇文章 0 订阅

在这里插入图片描述
思路:设 S 0 = 0 , S i = a 0 ⨁ a 1 ⨁ … … ⨁ a i − 1 S_0=0,S_i=a_0\bigoplus a_1\bigoplus……\bigoplus a_{i-1} S0=0,Si=a0a1ai1,由异或性质可知,数组 a r r arr arr [ i , j − 1 ] [i,j-1] [i,j1]的异或和等于 S j ⨁ S i S_j \bigoplus S_i SjSi,那么由题目的 a = b a=b a=b可以化简得到 S i = S k + 1 S_i=S_{k+1} Si=Sk+1,此时 j j j k + 1 − i k+1-i k+1i种选择,它们都是符合题意的解。所以我们可以 O ( n 2 ) O(n^2) O(n2)枚举 i 、 k i、k ik计算答案。更优的解决方案需要用到哈希表,假设我们在枚举 k k k,此时有 i 1 、 i 2 、 … … i m i_1、i_2、……i_m i1i2im都满足 S i = S k S_i=S_k Si=Sk,那么它们对答案的贡献为: ∑ t = 1 m ( k − 1 − i t ) = m ∗ ( k − 1 ) − ∑ t = 1 m i t \sum_{t=1}^m(k-1-i_t)=m*(k-1)-\sum_{t=1}^mi_t t=1m(k1it)=m(k1)t=1mit,两个哈希表即可解决。

class Solution {
public:
    int countTriplets(vector<int>& arr) {
        int n=arr.size(),cur=0,ans=0;
        unordered_map<int,int> cnt,sum;
        cnt[0]=1;
        for(int i=1;i<=n;i++)
        {
            cur^=arr[i-1];
            ans+=cnt[cur]*(i-1)-sum[cur];
            ++cnt[cur];
            sum[cur]+=i;
        }
        return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值