Hướng dẫn cho TLE-oj Cup Round 5 - Xoay xâu


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: Sunlight

Nhận xét: Thứ tự từ điển phụ thuộc vào số lượng xâu xoay có thứ tự từ điển nhỏ hơn với xâu ban đầu.

Subtask 1-3

Vì giới hạn |s| nhỏ nên ta có thể áp dụng độ phức tạp O(n) để so sánh xâu khởi đầu với một xâu xoay. Độ phức tạp: O(n^2)

Subtask 4,5

Giới hạn |s| lớn làm ta không thể so sánh xâu bằng cách cũ được. Ta có thể áp dụng hash kết hợp với chặt nhị phân. Các bạn có thể đọc tài liệu hash tại đây

Vậy làm sao để ta có thể chặt nhị phân trong tình huống này? Ta nhận thấy hash có thể so sánh hai xâu có bằng nhau hay không. Hay nói cách khác, giả sử ta so sánh 2 xâu ab có cùng độ dài n, gọi mảng c là mảng so sánh. Trong đó c_i=1 khi xâu con đoạn [1,i] của xâu a bằng xâu con đoạn [1,i] của xâu bc_i=0 trong trường hợp ngược lại

Nhận xét: Dãy c nhận được sẽ là 1 dãy giảm dần. Vì vậy ta có thể áp dụng chặt nhị phân để tìm vị trí i lớn nhất sao cho c_i=1.

Để so sánh 2 xâu sau khi tìm được i, ta so sánh tới ký tự i+1 của cả 2 xâu. Trường hợp i=n thì hai xâu bằng nhau

Độ phức tạp: O(n\cdot log(n))



Bình luận

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