canuc80k6200·1/50

Thứ Tự Các Hậu Tố

Nộp bài trên LQDOJ

Bài 62 · Suffix Structures

Với xâu có độ dài , hậu tố bắt đầu tại vị trí là xâu , trong đó các vị trí được đánh số từ . Hãy sắp xếp toàn bộ hậu tố theo thứ tự từ điển và in ra vị trí bắt đầu của chúng theo thứ tự đó.

Input

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

Output

  • In số nguyên trên một dòng. Số thứ là vị trí bắt đầu của hậu tố đứng thứ trong thứ tự từ điển.

Constraints

  • .
  • chỉ gồm các chữ cái thường tiếng Anh từ đến .
  • Vị trí trong xâu được đánh số từ .

Scoring

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

Example

Test 1

Input

cacao

Output

1 3 0 2 4

Giải thích: Các hậu tố theo thứ tự từ điển lần lượt là acao, ao, cacao, cao và . Vì vậy, các vị trí bắt đầu tương ứng là .

Lời giải tóm tắt
  • Ý tưởng: Ta thêm một ký hiệu kết thúc nhỏ hơn mọi chữ cái rồi sắp các phép quay vòng của xâu mở rộng bằng kỹ thuật nhân đôi. Ở vòng có độ dài 2^h, mỗi vị trí được mô tả bởi cặp lớp của hai nửa dài 2^(h-1); counting sort theo lớp giữ mỗi vòng ở O(n). Sau khi các lớp đã khác nhau, bỏ vị trí ký hiệu kết thúc để nhận mảng hậu tố của xâu ban đầu.
  • Ý tưởng: Tính đúng đắn: ở vòng đầu, lớp biểu diễn đúng thứ tự theo một ký tự. Nếu lớp ở vòng trước biểu diễn đúng thứ tự của đoạn dài 2^(h-1), thì cặp hai lớp biểu diễn đúng thứ tự của đoạn dài 2^h; sắp các cặp vì thế cho thứ tự đúng. Khi độ dài phủ toàn xâu mở rộng, mỗi phép quay tương ứng duy nhất với một hậu tố đứng sau ký hiệu kết thúc, nên mảng còn lại chính là thứ tự cần in.
  • Ý tưởng: Độ phức tạp là O(n log n) thời gian và O(n) bộ nhớ.