# [1310. XOR Queries of a Subarray](https://leetcode.com/problems/xor-queries-of-a-subarray/description) # 1. Tóm tắt đề bài Cho một mảng $arr$ gồm các số nguyên dương. Có $Q$ truy vấn, mỗi truy vấn hỏi $[L, R]$, và bạn phải tính tổng $xor$ của các phần tử từ $L$ đến $R$ trong dãy $arr$. ##### Giới hạn $1 \le |arr| \le 30000$ $1 \le q \le 30000$ $1 \le arr_i \le 10^9$ # 2. Tóm tắt lời giải **Độ phức tạp dự tính: $O(n + q)$** Ta có tính chất sau: - $a \oplus b = c$ - $b \oplus c = a$ - $c \oplus a = b$ Vì vậy, khi mà ta áp dụng prefix sum trên $arr$ (đặt là $psum$), ta có thể tính được tổng xor trong đoạn từ $L$ đến $R$ trong $O(1)$, bằng công thức $arr_R \oplus arr_{L - 1}$. # 3. Lời giải chi tiết Sau khi ra được ý tưởng, lời giải trở nên chỉ còn 2 bước khá đơn giản: - Tính mảng $psum$. - Dựa vào công thức tính kết quả cho từng query. Code mẫu (Golang): ```go= func xorQueries(arr []int, queries [][]int) []int { n := len(arr) psum := make([]int, n + 1) for i := 0; i < n; i++ { psum[i + 1] = psum[i] ^ arr[i] } res := make([]int, 0) for _, c := range queries { res = append(res, psum[c[1] + 1] ^ psum[c[0]]) } return res } ``` ### Độ phức tạp thuật toán Thời gian: $O(n)$ Bộ nhớ mở rộng: $O(n)$