Hướng dẫn cho Đếm Xâu Con


Chỉ sử dụng khi thực sự cần thiết như một cách tôn trọng tác giả và người viết hướng dẫn này.

Chép code từ bài hướng dẫn để nộp bài là hành vi có thể dẫn đến khóa tài khoản.

Authors: shiba

Ta sẽ sử dụng quy hoạch động để giải quyết bài toán.

Với mỗi vị trí \(i\) của xâu, ta cần tính số lượng xâu con khác nhau của xâu \(s_{1, i}\) có thể tạo ra bằng các thao tác trên. Gọi \(f(i)\) là số lượng xâu con khác nhau của \(s_{1, i}\) có thể tạo ra.

Ta cần tính \(f(i)\) từ \(f(j)\) với \(j\) là vị trí gần nhất của một chuỗi aa hoặc bb ở bên phải của vị trí \(i\) (hay còn gọi là next position). Gọi \(nx_{i, 0}\)\(nx_{i, 1}\) lần lượt là next position của aabb phía sau vị trí \(i\).

Từ vị trí \(i\), nếu ta chọn thay aa thì sẽ tạo ra một xâu \(s_{1, i + 1}\) có next position là \(nx_{i+1, 0}\) và nếu ta chọn thay bb thì sẽ tạo ra một xâu \(s_{1, i + 1}\) có next position là \(nx_{i+1, 1}\).

Ngoài ra, nếu tổng số lượng kí tự a của xâu \(s_{1, i}\) chia hết cho \(3\), ta còn có thể thay đổi tất cả các kí tự a thành b và ngược lại, để tạo ra một xâu con khác nữa.

Sử dụng quy hoạch động để tính \(f(i)\) cho mọi vị trí \(i\) từ cuối xâu đến đầu xâu.

Vì độ dài của xâu có thể lên đến \(2 \times 10^7\), ta cần lưu next position của aabb trong một mảng 2 chiều.

Độ phức tạp thuật toán: \(O(n)\) với \(n\) là độ dài của xâu.



Bình luận

Không có bình luận nào.