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
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
Ví dụ
#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