Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Hướng tiếp cận
Đây là một bài toán kinh điển kết hợp XOR tiền tố với trie nhị phân để tìm cặp giá trị có XOR lớn nhất.
Nhận xét quan trọng
Đặt và với . Vì XOR là phép có nghịch đảo bằng chính nó nên XOR của đoạn là
Bài toán trở thành: cho tập , tìm cặp với sao cho là lớn nhất.
Khi cho phép thì cặp luôn cho giá trị , nên kể cả nếu coi là hợp lệ cũng không ảnh hưởng cực đại — miễn là tập có ít nhất hai phần tử (luôn đúng vì luôn có mặt).
Thuật toán
Duyệt theo thứ tự và duy trì một trie nhị phân 30 bit (bit cao bit thấp) chứa các giá trị .
- Khởi tạo trie rỗng rồi insert . Đây là bước bắt buộc: nếu thiếu, các đoạn dạng sẽ không được xét vì không có cách nào sinh ra.
- Với mỗi từ đến :
- Truy vấn trie để tìm giá trị trong trie cực đại hoá : đi từ bit cao xuống bit thấp; tại mỗi bit, ưu tiên rẽ sang nhánh có bit ngược với bit hiện tại của (nếu nhánh đó tồn tại), ngược lại đi theo nhánh còn lại.
- Cập nhật đáp án: .
- Insert vào trie.
- Khi , trie ban đầu chứa , truy vấn cho trả về — đúng đáp án.
Cài đặt trie mảng (C++)
Dùng hai mảng nxt[N*30 + 10][2] để biểu diễn cây. Mỗi lần insert/query là . Tổng cộng ô nhớ.
Cài đặt Python
Vì Python chậm hơn nhiều lần, ta dùng trie dạng mảng phẳng nxt = [[0,0]] * (n*30 + 5) (cấp phát một lần) và sử dụng các phép dịch bit. Đọc dữ liệu bằng sys.stdin.buffer.read() để tăng tốc.
Độ phức tạp
- Thời gian: .
- Bộ nhớ: cho trie.
Bình luận