zoukankan      html  css  js  c++  java
  • 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;
        }
    };
  • 相关阅读:
    SNOI 2019 字符串
    1068: [SCOI2007]压缩
    POJ 1848 Tree 树形DP
    BZOJ bzoj1396 识别子串
    BZOJ 4503: 两个串
    BZOJ 2302: [HAOI2011]Problem c(数学+DP)
    BZOJ 3157: 国王奇遇记 (数学)
    CF_528D
    BZOJ 3000: Big Number (数学)
    新の开始
  • 原文地址:https://www.cnblogs.com/FEIIEF/p/12865021.html
Copyright © 2011-2022 走看看