canuc80k4601·2/28

Người Bạn Không Giao Bit

Nộp bài trên LQDOJ

Bài 46 · SOS DP

Cho dãy số nguyên không âm. Với mỗi phần tử, hãy chọn một giá trị xuất hiện trong dãy sao cho hai giá trị không có bit chung. Có thể chọn chính lần xuất hiện đang xét. Nếu không có giá trị phù hợp, trả .

Input

  • Dòng đầu chứa . Dòng thứ hai chứa số nguyên .

Output

  • In số. Số thứ là một giá trị xuất hiện trong dãy và thỏa ; nếu không tồn tại thì in . Khi có nhiều đáp án, được phép in bất kỳ đáp án hợp lệ nào.

Constraints

  • .
  • .

Scoring

  • Subtask ( số điểm): và .
  • Subtask ( số điểm): Không có giới hạn bổ sung.

Example

Test 1

Input

5
1 2 3 4 7

Output

4 4 4 3 -1

Giải thích: Các lựa chọn trong output đều hợp lệ vì và . Với , mọi giá trị trong dãy đều có ít nhất một bit chung, nên đáp án cuối là .

Lời giải tóm tắt
  • Phân tích: Ta cần một giá trị xuất hiện trong dãy và chỉ dùng các bit mà a_i không dùng. Nói cách khác, witness phải là một submask của ALL xor a_i. Vì chỉ cần trả về một witness bất kỳ, mỗi trạng thái chỉ cần lưu một giá trị đại diện thay vì số lượng.
  • Thuật toán: Khởi tạo any[m]=m nếu mask m xuất hiện, ngược lại bằng -1. Chạy subset SOS: với từng bit, nếu any[m] chưa có witness thì kế thừa any[m bỏ bit]. Sau biến đổi, any[m] là một giá trị xuất hiện và là submask của m, hoặc -1 nếu không tồn tại. Với mỗi a_i, trả any[ALL xor a_i].
  • Chứng minh đúng đắn: Bất biến của subset SOS là sau khi xử lý một tập bit, any[m] chứa một mask xuất hiện có thể nhận được từ m bằng cách bỏ các bit đã xử lý. Kết thúc mọi bit, tập ứng viên chính xác là toàn bộ submask của m; do đó any[m] tồn tại đúng khi có ít nhất một giá trị xuất hiện là submask của m.
  • Chứng minh đúng đắn: Với m=ALL xor a_i, mọi submask x của m không có bit 1 chung với a_i, nên a_i & x=0. Ngược lại, mọi witness thỏa AND bằng 0 đều chỉ dùng bit thuộc m và là submask của m. Vì vậy giá trị trả về hoặc -1 là đúng; checker cho phép mọi witness hợp lệ.
  • Độ phức tạp: O(n + B·2^B) thời gian và O(2^B) bộ nhớ, với B≤22.