canuc80k4800·1/50

Dấu Vết Tiền Tố

Nộp bài trên LQDOJ

Bài 48 · Z Function

Với xâu có độ dài , đặt . Với mỗi là số lớn nhất sao cho . Hãy tính toàn bộ mảng này; các vị trí được đánh số từ .

Input

  • Một dòng chứa xâu gồm các chữ cái thường tiếng Anh.

Output

  • In số nguyên trên một dòng.

Constraints

  • .
  • Mọi ký tự của nằm trong .

Scoring

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

Example

Test 1

Input

abacaba

Output

7 0 1 0 3 0 1

Giải thích: Ở vị trí (-based), hậu tố aba trùng ba ký tự đầu của xâu nên ; các giá trị khác được xác định tương tự.

Lời giải tóm tắt
  • Ý tưởng: Duy trì hộp Z phải nhất [l,r], tái sử dụng giá trị trong hộp rồi mở rộng ngoài biên.
  • Chứng minh đúng: Trong hộp [l,r], đoạn S[l..r] trùng tiền tố. Vì vậy tại i≤r ta biết chắc ít nhất min(r-i+1,Z[i-l]) ký tự khớp. Vòng so sánh tiếp chỉ kiểm tra phần chưa được chứng minh; khi dừng, giá trị thu được là LCP tối đại. Mỗi lần mở rộng ngoài hộp làm r tăng nên tổng số phép mở rộng là tuyến tính.
  • Độ phức tạp: O(n) thời gian và O(n) bộ nhớ.
  • Mẫu công khai: So sánh từng hậu tố với tiền tố cho xâu abacaba cho dãy 7,0,1,0,3,0,1.