canuc80k1917·18/50

Tập Tiền Tố

Nộp bài trên LQDOJ

Bài 19 · Hashing

Cho hai dãy số nguyên và , cùng có phần tử. Với một prefix, ta chỉ quan tâm một giá trị có xuất hiện hay không; thứ tự và số lần lặp đều không ảnh hưởng đến tập giá trị của prefix đó.

Mỗi truy vấn cho hai số và . Hãy kiểm tra xem tập các giá trị xuất hiện trong có bằng tập các giá trị xuất hiện trong hay không.

Input

  • Dòng đầu chứa số nguyên .
  • Dòng thứ hai chứa số nguyên .
  • Dòng thứ ba chứa số nguyên .
  • Dòng tiếp theo chứa số nguyên .
  • dòng sau, mỗi dòng chứa hai số nguyên và .

Output

  • Với mỗi truy vấn, in Yes nếu hai tập bằng nhau; ngược lại in No.

Constraints

  • .
  • .
  • .

Scoring

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

Example

Test 1

Input

6
5 1 5 2 3 2
1 5 1 3 2 4
6
1 1
2 2
3 3
4 4
5 5
6 6

Output

No
Yes
Yes
No
Yes
No

Giải thích: Ở truy vấn thứ hai và thứ ba, cả hai prefix đều có tập dù thứ tự và số lần lặp khác nhau. Truy vấn thứ tư so sánh với , còn truy vấn cuối có thêm giá trị chỉ ở prefix của , nên đều nhận No.

Lời giải tóm tắt
  • Ý tưởng: Nén tất cả giá trị của hai dãy. Gán cho mỗi id hai số 64-bit giả ngẫu nhiên được sinh tất định. Khi quét một dãy, một giá trị chỉ được XOR vào chữ ký prefix ở lần xuất hiện đầu tiên; các lần lặp sau giữ nguyên chữ ký.
  • Ý tưởng: Vì vậy, mọi prefix có cùng tập giá trị sẽ XOR đúng cùng danh sách tag. Mỗi query chỉ cần so sánh cặp chữ ký tại x và y. Nếu hai tập khác nhau, để bị nhầm thì XOR của hiệu đối xứng phải đồng thời bằng 0 ở cả hai thành phần, có xác suất cực nhỏ.
  • Ý tưởng: Độ phức tạp là O(N log N + Q) thời gian do bước nén và O(N) bộ nhớ.