---
# System prepended metadata

title: LRXOR Solution
tags: [LRXOR]

---

---
author: little
tags: LRXOR 
title: LRXOR Solution
---

$\Huge\text{LRXOR Solution}$

-------

:::info
🔗 Links: [Đề bài](https://drive.google.com/file/d/14-FTNQwh6k8yXiXnIIew8g6CCPy0FvDm/view?usp=share_link)
📌 Tags: `bitmask` `data structures`   
✍️ Writer: little  
📋 Content:
[TOC]
:::

-----

## Giới Thiệu Đề Bài

Cho dãy số $a$ gồm $n$ phần tử, tìm dãy con liên tiếp có tổng $xor$ lớn nhất. Tức là tìm đoạn $a[l..r]$ sao cho $a[l]$ ^ $a[l+1]$ ^ $...$ ^ $a[r-1]$ ^ $a[r]$ lớn nhất.

-----

## Thuật toán

Có một nhận xét khá quan trọng để $AC$ bài này, gọi $pre[i]$ là tổng $xor$ của các phần tử từ $1$ đến $i$. Ta có: tổng $xor$ của đoạn $[l, r]$ bằng $pre[r]$ ^ $pre[l - 1]$.

Như vậy bài toán sẽ trở thành: khi ta xét đến phần tử thứ $i$, ta sẽ tìm $1$ phần tử $j$ ở trước đó sao cho $pre[i]$ ^ $pre[j]$ lớn nhất.

Để làm được điều đó, ta sử dụng một cấu trúc dữ liệu gọi là $cây$ $tiền$ $tố$ [trie](https://vnoi.info/wiki/algo/data-structures/trie.md). Mỗi nút của cây $trie$ sẽ lưu một giá trị $0$ hoặc $1$. Khi đi từng nút của cây $trie$ ta sẽ đi sang trái nếu nút đó có giá trị là $0$ và sang phải nếu nó là $1$. 

Ban đầu cho $ans$ $=$ $0$, ta sẽ duyệt từng $bit$ một theo thứ tự từ trái sang phải (tức là từ bit lớn nhất về bit nhỏ nhất). Nếu như $bit$ $i$ hiện tại là $0$ thì ta sẽ ưu tiên rẽ qua phải (bởi vì khi rẽ phải thì ta sẽ có bật được $bit$ thứ $i$ lên đồng nghĩa với việc $ans$ của chúng ta sẽ lớn hơn). Còn nếu $bit$ $i$ hiện tại là $1$ thì ta sẽ rẽ trái. Và tất nhiên nếu như chỉ có duy nhất $1$ sự lựa chọn là rẽ trái hoặc rẽ phải thì ta phải đi theo đó. 

Với mỗi lần rẽ phải hoặc trái, ta sẽ cập nhật kết quả $ans$ luôn.

Vậy độ phức tạp bài toán sẽ là $O(n * log(max(a[i])))$.

----

Tham khảo code ở [đây](https://ideone.com/H1dwTk)