Giả sử chúng ta có một mảng A với N phần tử. Ta phải tìm số cặp số nguyên l và r thỏa mãn A [l] XOR A [l + 1] XOR ... XOR A [r-1] XOR A [r] =A [l] + A [ l + 1] + ... A [r].
Vì vậy, nếu đầu vào là A =[2, 5, 4, 6], thì đầu ra sẽ là 5, vì đối với các cặp (1,1), (2,2), (3,3), (4, 4) và (1,2).
Các bước
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
n := size of A Define some arrays of size (n + 1) each, a, s and sx for initialize i := 1, when i <= n, update (increase i by 1), do: a[i] := A[i - 1] s[i] := s[i - 1] + a[i] sx[i] := sx[i - 1] XOR a[i] res := 0 for initialize l := 1, when l <= n, update (increase l by 1), do: bg := l, en = n, r = l while bg <= en, do: mi := (bg + en) / 2 if s[mi] - s[l - 1] is same as (sx[mi] XOR sx[l - 1]), then: r := mi bg := mi + 1 Otherwise en := mi - 1 res := res + (r - l + 1) return res
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; int solve(vector<int> A){ int n = A.size(); vector<int> a(n + 1), s(n + 1), sx(n + 1); for (int i = 1; i <= n; i++){ a[i] = A[i - 1]; s[i] = s[i - 1] + a[i]; sx[i] = sx[i - 1] ^ a[i]; } int res = 0; for (int l = 1; l <= n; l++){ int bg = l, en = n, r = l; while (bg <= en){ int mi = (bg + en) / 2; if (s[mi] - s[l - 1] == (sx[mi] ^ sx[l - 1])){ r = mi; bg = mi + 1; } else en = mi - 1; } res += (r - l + 1); } return res; } int main(){ vector<int> A = { 2, 5, 4, 6 }; cout << solve(A) << endl; }
Đầu vào
{ 2, 5, 4, 6 }
Đầu ra
5