Hướng dẫn giải của Mảnh Ghép Lời Tiên Tri
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à bài toán Shortest Superstring (Siêu xâu ngắn nhất) — một bài toán NP-hard kinh điển. Tuy nhiên, với , ta có thể giải bằng quy hoạch động trên bitmask tương tự bài toán Người du lịch (TSP).
Nhận xét quan trọng
Loại bỏ xâu con: Nếu xâu là xâu con (substring) của xâu , thì không đóng góp gì vào siêu xâu — ta có thể bỏ nó. Bước này rất quan trọng vì nếu không loại bỏ, bitmask DP sẽ cho kết quả sai (DP tính overlap giữa suffix/prefix, không tính containment).
Overlap giữa hai xâu: Gọi là độ dài dài nhất sao cho hậu tố (suffix) của trùng với tiền tố (prefix) của . Khi nối sau , ta chỉ cần thêm ký tự.
Bài toán tương đương TSP: Tối thiểu hóa tổng độ dài siêu xâu tương đương với tối đa hóa tổng overlap. Mỗi xâu là một "thành phố", và ta cần tìm đường đi qua tất cả thành phố (permutation) sao cho tổng overlap lớn nhất.
Thuật toán
Bước 1: Tiền xử lý
- Loại bỏ các xâu trùng lặp.
- Loại bỏ các xâu là xâu con của xâu khác.
- Gọi là số xâu còn lại sau khi loại bỏ.
Bước 2: Tính overlap
- Với mỗi cặp trong xâu, tính = độ dài dài nhất sao cho kết thúc bằng ký tự đầu của .
- Có thể tính bằng brute force hoặc dùng KMP cho hiệu quả hơn.
Bước 3: Bitmask DP
- = độ dài ngắn nhất của siêu xâu chứa đúng các xâu trong , kết thúc bằng xâu .
- Trạng thái gốc: với mỗi .
- Chuyển trạng thái: Với mỗi , xâu cuối , và xâu tiếp theo :
- Đáp án:
Độ phức tạp
- Thời gian: trong đó là tổng độ dài các xâu và .
- Bộ nhớ:
Bình luận