canuc80k4812·13/50

Biên Và Số Lần Xuất Hiện

Nộp bài trên LQDOJ

Bài 48 · Z Function

Xét mọi tiền tố không rỗng của xâu đồng thời là hậu tố của ; toàn bộ xâu cũng được tính. Với mỗi độ dài hợp lệ , hãy đếm số vị trí bắt đầu mà tiền tố dài xuất hiện như một substring của . Các lần xuất hiện chồng lấn vẫn được tính.

Input

  • Dòng duy nhất chứa xâu .

Output

  • Dòng đầu in số cặp . Mỗi dòng tiếp theo in , trong đó là số lần tiền tố dài xuất hiện. Các cặp được in theo tăng dần.

Constraints

  • .
  • chỉ gồm chữ cái hoa tiếng Anh.

Scoring

  • Subtask (): .
  • Subtask (): Không có giới hạn bổ sung.

Example

Test 1

Input

ABACABA

Output

3
1 4
3 2
7 1

Giải thích: Các độ dài vừa là tiền tố vừa là hậu tố là ; chúng xuất hiện lần lượt lần.

Lời giải tóm tắt
  • Ý tưởng: Đếm tần suất các giá trị Z vào cnt, rồi cộng dồn từ phải sang trái để cnt[L] bằng số vị trí i thỏa Z[i]≥L. Duyệt L tăng dần; chỉ giữ những L mà tiền tố dài L đồng thời là hậu tố của S, và in cnt[L]. Toàn bộ xâu, tức L=n, luôn được tính.
  • Chứng minh đúng: Một vị trí bắt đầu i tạo ra một lần xuất hiện của tiền tố dài L đúng khi Z[i]≥L. Vì vậy tổng hậu tố của bảng tần suất Z cho đúng số lần xuất hiện của từng độ dài L. Điều kiện L=n hoặc Z[n-L]≥L chọn đúng và đủ các tiền tố cũng là hậu tố. Do đó mọi cặp được in đều chính xác và không bỏ sót độ dài hợp lệ nào.
  • Độ phức tạp: O(n) thời gian và O(n) bộ nhớ.
  • Mẫu công khai: Các độ dài biên là 1,3,7; số vị trí xuất hiện tương ứng là 4,2,1.