Giả sử chúng ta có một mảng các số nguyên arr. Chúng ta muốn chọn ba chỉ số như i, j và k trong đó (0 <=i
Vì vậy, nếu đầu vào là [2,3,1,6,7], thì đầu ra sẽ là 4, vì các bộ ba là (0,1,2), (0,2,2), (2,3 , 4) và (2,4,4)
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
-
ret:=0
-
n:=kích thước của arr
-
để khởi tạo i:=1, khi i
-
Xác định một bản đồ m
-
x1:=0, x2:=0
-
để khởi tạo j:=i - 1, khi j> =0, cập nhật (giảm j đi 1), thực hiện -
-
x1:=x1 XOR arr [j]
-
(tăng m [x1] lên 1)
-
-
để khởi tạo j:=i, khi j
-
x2:=x2 XOR arr [j]
-
ret:=ret + m [x2]
-
-
-
trả lại ret
Ví dụ
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
#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)); }
Đầu vào
{2,3,1,6,7}
Đầu ra
4