canuc80k2105·6/50

Chu Kỳ Của Các Tiền Tố

Nộp bài trên LQDOJ

Bài 21 · KMP

Với một xâu , tiền tố dài được gọi là tuần hoàn nếu nó bằng một xâu ngắn hơn lặp lại nguyên số lần, và số lần lặp ít nhất là . Bạn cần xử lý nhiều testcase và liệt kê mọi tiền tố tuần hoàn của từng xâu.

Input

  • Dòng đầu chứa số nguyên .
  • Mỗi testcase gồm một dòng chứa , tiếp theo là một dòng chứa xâu có đúng ký tự.

Output

  • Với testcase thứ , trước hết in dòng Test case #x. Sau đó, với mỗi tiền tố tuần hoàn theo thứ tự độ dài tăng dần, in một dòng gồm độ dài tiền tố và số lần lặp. In thêm một dòng trống sau mỗi testcase.

Constraints

  • .
  • cho mỗi testcase.
  • Tổng các giá trị không vượt quá .
  • Mỗi xâu chỉ gồm các chữ cái thường tiếng Anh.

Scoring

  • Subtask ( số điểm): Tổng các giá trị không vượt quá .
  • Subtask ( số điểm): Không có giới hạn bổ sung.

Example

Test 1

Input

1
6
ababab

Output

Test case #1
4 2
6 3

Giải thích: Tiền tố là ab lặp hai lần, còn toàn xâu ababab là ab lặp ba lần. Các tiền tố còn lại không phải phép lặp nguyên ít nhất hai lần.

Lời giải tóm tắt
  • Phân tích: Với mỗi testcase, xét từng tiền tố độ dài i của S và in i cùng số lần lặp nếu tiền tố đó là lũy thừa của một xâu ngắn hơn với số mũ ít nhất 2. Prefix-function lưu độ dài tiền tố dài nhất còn có thể tái sử dụng sau mỗi ký tự, nên toàn bộ dữ liệu được xử lý mà không quay lại các vị trí đã loại.
  • Thuật toán: Tính prefix-function cho từng S; với mỗi i, đặt p=i-pi[i-1] và in nếu pi[i-1]>0 cùng i chia hết p.
  • Chứng minh: Trong khi quét, trạng thái KMP luôn bằng độ dài tiền tố dài nhất của mẫu hoặc của chính xâu đang xét trùng với hậu tố đã đọc. Mỗi lần lùi chỉ đi qua một border hợp lệ, nên không bỏ sót khả năng nối tiếp; quy tắc ghi nhận và chuyển trạng thái của bài vì thế tạo đúng toàn bộ kết quả cần in. Các kết quả được xử lý theo thứ tự vị trí hoặc độ dài tăng dần như contract yêu cầu, nên không đếm trùng và không đảo thứ tự.
  • Độ phức tạp: Thuật toán chạy tuyến tính theo tổng kích thước input và dùng bộ nhớ tuyến tính theo xâu được xây prefix-function, ngoài phần output bắt buộc.