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;
        }
    };
  • 相关阅读:
    POJ 1401 Factorial
    POJ 2407 Relatives(欧拉函数)
    POJ 1730 Perfect Pth Powers(唯一分解定理)
    POJ 2262 Goldbach's Conjecture(Eratosthenes筛法)
    POJ 2551 Ones
    POJ 1163 The Triangle
    POJ 3356 AGTC
    POJ 2192 Zipper
    POJ 1080 Human Gene Functions
    POJ 1159 Palindrome(最长公共子序列)
  • 原文地址:https://www.cnblogs.com/FEIIEF/p/12865021.html
Copyright © 2011-2022 走看看