Xâu con chung dài nhất (LCS) và truy vết khôi phục chuỗi
Trong hệ thống đối soát phiên bản mã nguồn của AI Empire Academy, công cụ diff cần tìm chuỗi chỉ thị chung dài nhất giữa hai bản thảo thuật toán để xác định phần mã không bị thay đ…
Tiến độ của tôi ở bài này
Điểm được lưu vào tài khoản sau khi chấm bài.
Đang tải điểm của bạn…
Kiến thức và chủ đề
Kiến thức tiên quyết: dp 2d, std string, std vector.
Nội dung đề bài
Mục tiêu kiến thức
- Nắm vững công thức quy hoạch động LCS trên 2 chuỗi ký tự O(N × M).
- Cài đặt kỹ thuật truy vết ngược từ bảng DP để khôi phục cấu trúc xâu con chung dài nhất.
- Hiểu cách tối ưu hóa bộ nhớ và xử lý dữ liệu xâu trong C++.
Mô tả bài toán
Trong hệ thống đối soát phiên bản mã nguồn của AI Empire Academy, công cụ diff cần tìm chuỗi chỉ thị chung dài nhất giữa hai bản thảo thuật toán để xác định phần mã không bị thay đổi. Cho hai chuỗi ký tự S1 và S2 chỉ gồm các chữ cái in hoa tiếng Anh ('A' đến 'Z').
Một chuỗi S được gọi là chuỗi con (subsequence) của S1 nếu có thể thu được S bằng cách xóa đi một số (hoặc không xóa) ký tự từ S1 mà không làm thay đổi thứ tự tương đối của các ký tự còn lại.
Nhiệm vụ của bạn là:
- Tìm độ dài của xâu con chung dài nhất (LCS) của S1 và S2.
- Khôi phục và in ra xâu con chung đó theo quy tắc truy vết chuẩn sau:
- Xuất phát từ ô (N, M) của bảng dp, lùi về (0, 0).
- Nếu S1[i-1] == S2[j-1], ký tự này thuộc LCS, lùi về (i-1, j-1).
- Ngược lại nếu dp[i-1][j] ≥ dp[i][j-1], lùi về (i-1, j).
- Ngược lại, lùi về (i, j-1).
- Đảo ngược chuỗi ký tự thu được để có xâu kết quả.
Quy ước nộp bài
- Chỉ cần viết một chương trình đọc
stdinvà in rastdout. Bài này không yêu cầu viết hàm. - Không dùng
coutđể in lời nhắc trước khi đọc dữ liệu. Lời nhắc sẽ lọt vàostdoutvà làm bài sai. - Chỉ in đúng nội dung ở mục Output. Không in thêm nhãn, dòng trống hay ký tự thừa.
- Output được so khớp từng ký tự, phân biệt chữ hoa/thường và dấu câu.
Input
- Dòng 1: Xâu ký tự S1 (1 ≤ |S1| ≤ 2000).
- Dòng 2: Xâu ký tự S2 (1 ≤ |S2| ≤ 2000).
- Cả hai xâu chỉ gồm các chữ cái in hoa tiếng Anh
A-Z.
Output
- Dòng 1: Một số nguyên duy nhất là độ dài của LCS.
- Dòng 2: Xâu con chung dài nhất khôi phục được. Nếu độ dài bằng 0, in dòng trống.
Ràng buộc
- 1 ≤ |S1|, |S2| ≤ 2000.
- Thời gian chạy: 1000ms.
- Bộ nhớ tối đa: 256MB.
Ví dụ 1
Input
AGGTAB
GXTXAYBOutput
4
GTABVí dụ 2
Input
ABCBDAB
BDCABAOutput
4
BCBAGợi ý và lời giải chỉ mở sau khi bạn bấm Nộp bài. Giáo viên và quản trị viên mở được ngay.
Góp ý & báo lỗi bài tập
Đề bài chưa rõ, test có vấn đề hay bạn có ý tưởng giúp bài tốt hơn? Gửi cho đội ngũ AI Empire nhé — mỗi góp ý đều được đọc.
