Xâu đẩy vòng
Xem dạng PDFXâu ~t~ được gọi là xâu đẩy vòng nhận được từ xâu ~s~ nếu tồn tại hai xâu con ~u, v~ (có thể rỗng) sao cho ~t = uv~ và ~s = vu~. Nói cách khác, ~t~ là một phép xoay vòng (cyclic shift) của ~s~.
Xét xâu ~s~ chỉ gồm các chữ cái Latin thường. Xâu ~s~ được gọi là xâu đẩy vòng bậc ~k~ nếu có thể chia ~s~ thành ~k~ xâu con liên tiếp có độ dài bằng nhau, và mọi xâu con thu được đều là xâu đẩy vòng của một xâu con bất kỳ trong số đó (tức là tất cả các xâu con đều là các xoay vòng của nhau).
Với xâu ~s~ cho trước, hãy xác định tất cả các bậc ~k~ mà ~s~ là xâu đẩy vòng bậc ~k~.
Yêu cầu
Với xâu ~s~, hãy tìm tập các số nguyên dương ~k~ sao cho:
- ~k~ chia hết độ dài ~|s|~
- Khi chia ~s~ thành ~k~ đoạn liên tiếp, mỗi đoạn dài ~|s|/k~, thì mọi đoạn là xoay vòng của nhau.
In ra số lượng bậc tìm được và danh sách các bậc đó theo thứ tự tăng dần.
Dữ liệu
Gồm một dòng chứa xâu ~s~, với ~1 \le |s| \le 2\times 10^5~. ~s~ chỉ gồm các chữ cái Latin thường.
Kết quả
- Dòng 1: số nguyên ~m~ — số lượng bậc tìm được.
- Dòng 2: ~m~ số nguyên theo thứ tự tăng dần — các bậc đẩy vòng của xâu.
Ví dụ
Ví dụ 1
Input
abbabaab
Output
3
1 2 4
Giải thích
Ví dụ 1
~|s| = 8~.
- ~k = 1~: chỉ có một đoạn, luôn thỏa.
- ~k = 2~, mỗi đoạn dài ~4~: ~abba~ và ~baab~ là xoay vòng của nhau.
- ~k = 4~, mỗi đoạn dài ~2~: các đoạn lần lượt là ~ab, ba, ba, ab~, đều là xoay vòng của nhau.
Các giá trị khác không thỏa.
Ràng buộc và chấm điểm
Ràng buộc
- ~1 \le |s| \le 2\times 10^5~
- ~s~ chỉ gồm chữ cái Latin thường
Bình luận