canuc80k2709·10/50

Hai Mặt, Một Tổng

Nộp bài trên LQDOJ

Bài 27 · Bitset

Có thẻ. Thẻ thứ có hai lựa chọn: mặt mang giá trị , mặt mang giá trị . Phải chọn đúng một mặt của mỗi thẻ sao cho tổng bằng . Trong tất cả chuỗi lựa chọn hợp lệ, hãy dùng thứ tự từ điển với và in chuỗi nhỏ nhất.

Input

  • Dòng đầu chứa và .
  • Mỗi trong dòng tiếp theo chứa và .

Output

  • Nếu không có cách chọn, in No.
  • Nếu có, in Yes ở dòng đầu và chuỗi ký tự H/T nhỏ nhất theo thứ tự từ điển ở dòng thứ hai.

Constraints

  • .
  • .
  • .
  • Thứ tự từ điển dùng quy ước .

Scoring

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

Example

Test 1

Input

3 10
1 5
2 4
3 7

Output

Yes
HHT

Giải thích: Hai chuỗi HHT và THH đều có tổng . Vì ký tự đầu của HHT là còn của THH là , chuỗi HHT nhỏ hơn theo quy ước .

Lời giải tóm tắt
  • Mô hình và ý tưởng: Dựng DP hậu tố: suf[i] chứa các tổng tạo được từ thẻ i..N-1; khi truy vết, chọn H nếu phần còn lại vẫn khả thi, nếu không chọn T.
  • Chứng minh tính đúng đắn: suf[i][t] đúng khi các thẻ từ i trở đi tạo được tổng t, theo quy nạp ngược. Khi dựng đáp án, nếu chọn H vẫn để lại một tổng hậu tố khả thi thì mọi nghiệm bắt đầu bằng T đều lớn hơn, nên phải chọn H; chỉ khi H không thể mới chọn T. Lặp lại cho từng vị trí tạo đúng nghiệm từ điển nhỏ nhất.
  • Độ phức tạp: O(NS/w + N) thời gian và O(NS/w) bộ nhớ để giữ các lớp hậu tố.
  • Lỗi cài đặt thường gặp: ưu tiên T khi cả hai nhánh được; chỉ in một nghiệm bất kỳ.