trang chủ / đề bài / kmpcnt / lời giải

Đếm xuất hiện không chồng lấp

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.
Tác giả: huunguyenhuunguyen

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 P trong S, 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 |P|. 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 đủ (j=|P|), thay vì cập nhật j←π[|P|−1] (để bắt cả các match chồng lấp), ta đặt lại j←0 rồi tiếp tục quét — đây chính là phép "bỏ qua |P| ký tự" của xuất hiện vừa lấy.

Thuật toán

  1. Đọc S,P. Đặt n=|S|, m=|P|. Nếu m>n in ra 0 và dừng.
  2. Tính mảng failure function π[0..m−1] của P theo KMP chuẩn.
  3. Quét S với biến j là chỉ số đang khớp trên P, ban đầu j=0, đếm cnt=0.
  4. Với mỗi i từ 0 tới n−1:
    • Trong khi j>0 và S[i]≠P[j]: j←π[j−1].
    • Nếu S[i]=P[j]: j←j+1.
    • Nếu j=m: cnt←cnt+1, j←0 (reset, không cho chồng lấp).
  5. In cnt.

Độ phức tạp

  • Thời gian: O(|S|+|P|).
  • Bộ nhớ: O(|P|) cho mảng failure function.

Bình luận

Không có bình luận tại thời điểm này.

gnatmake 12.2.0 a68g 3.1.2 nasm 2.16.1 as_x64 2.47 awk 1.3.4 gcc 16.2.0 dotnet 10.0.402 g++ 16.2.0 g++-themis 16.2.0 g++17 16.2.0 g++20 16.2.0 g++23 16.2.0 clang++ 22.1.8 dmd 2.113.0 dart 3.13.6 gforth 0.7.3 gfortran 15.3.0 go 1.27.3 groovyc 5.1.3 javac 26.0.2.1 node 26.12.1 julia 1.13.2 kotlinc 2.4.21 lean 4.35.0 sbcl 2.2.9 lua 5.5.1 nim 2.2.12 fpc 3.2.2 fpc-themis 3.2.2 perl 5.42.3 php 8.5.12 pike 8.0 swipl 9.0.4 pypy3 7.3.23 python3 3.15.1 racket 8.7 ruby 4.0.8 rustc 1.99.1 csc 5.3.0 ctoj-scratch 0.0.1 sed 4.9 swiftc 6.4.1 tclsh 8.6 bun 1.4.4 deno 2.9.8 v 0.5.2 zig 0.17.0