Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
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.
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
Dùng KMP để xác định mọi vị trí có thể có xuất hiện của trong , rồi áp dụng chiến lược tham lam để đếm số xuất hiện không chồng lấp.
Nhận xét quan trọng
Bài toán "chọn nhiều xuất hiện không chồng lấp nhất" tương đương bài kinh điển "chọn nhiều khoảng không giao nhau nhất trên trục số" khi mọi khoảng có cùng độ dài . Khi mọi khoảng có chung độ dài, tham lam quét trái-phải, gặp khoảng nào còn dùng được thì lấy ngay cho ra kết quả tối ưu.
Trên KMP, khi gặp match đầy đủ (), thay vì cập nhật (để bắt cả các match chồng lấp), ta đặt lại rồi tiếp tục quét — đây chính là phép "bỏ qua ký tự" của xuất hiện vừa lấy.
Thuật toán
- Đọc . Đặt , . Nếu in ra và dừng.
- Tính mảng failure function của theo KMP chuẩn.
- Quét với biến là chỉ số đang khớp trên , ban đầu , đếm .
- Với mỗi từ tới :
- Trong khi và : .
- Nếu : .
- Nếu : , (reset, không cho chồng lấp).
- In .
Độ phức tạp
- Thời gian: .
- Bộ nhớ: cho mảng failure function.
Bình luận