计算可以在C ++中形成两个相等XOR数组的三元组
假设我们有一个整数数组arr。我们要选择三个索引,例如i,j和k,其中(0<=i<j<=k<N),N是数组的大小。a和b的值如下:a=arr[i]XORarr[i+1]XOR...XORarr[j-1]b=arr[j]XORarr[j+1]XOR..。XORarr[k]我们必须找到三元组(i,j,k)的数量,其中a与b相同。
因此,如果输入类似于[2,3,1,6,7],则输出将为4,因为三元组分别为(0,1,2),(0,2,2),(2,3,4)和(2,4,4)
为了解决这个问题,我们将遵循以下步骤-
ret:=0
n:=arr的大小
对于初始化i:=1,当i<n时,更新(将i增加1),-
x2:=x2XORarr[j]
ret:=ret+m[x2]
x1:=x1XORarr[j]
(将m[x1]增加1)
定义一张映射
x1:=0,x2:=0
对于初始化j:=i-1,当j>=0时,更新(将j减1),-
对于初始化j:=i,当j<n时,更新(将j增加1),-
返回ret
例
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h> using namespace std; class Solution { public: int countTriplets(vector<int>& arr) { int ret = 0; int n = arr.size(); for (int i = 1; i < n; i++) { map<int, int> m; int x1 = 0; int x2 = 0; for (int j = i - 1; j >= 0; j--) { x1 = x1 ^ arr[j]; m[x1]++; } for (int j = i; j < n; j++) { x2 = x2 ^ arr[j]; ret += m[x2]; } } return ret; } }; main(){ Solution ob; vector<int> v = {2,3,1,6,7}; cout << (ob.countTriplets(v)); }
输入值
{2,3,1,6,7}
输出结果
4