Xâu đẩy vòng

Xem dạng PDF

Gửi bài giải

Điểm: 1,00 (OI)
Giới hạn thời gian: 1.0s
Giới hạn bộ nhớ: 256M
Input: stdin
Output: stdout

Dạng bài

Xâ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

Hãy đọc nội quy trước khi bình luận.


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