Tín hiệu lặp

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

Trạm quan sát nhận được một chuỗi tín hiệu gồm các chữ cái thường. Một đoạn tín hiệu được gọi là lặp nếu đoạn đó xuất hiện ít nhất hai lần trong chuỗi, các lần xuất hiện có thể chồng lên nhau.

Cho xâu tín hiệu ~s~ độ dài ~n~. Hãy tìm độ dài lớn nhất của một đoạn tín hiệu lặp.

Yêu cầu

Tìm số nguyên lớn nhất ~L~ sao cho tồn tại hai vị trí bắt đầu khác nhau ~i~ và ~j~ mà:

~s[i..i+L-1] = s[j..j+L-1]~.

Nếu không có đoạn lặp không rỗng, in ~0~.

Dữ liệu

Dữ liệu vào từ chuẩn gồm:

  • Dòng đầu tiên chứa số nguyên ~n~.
  • Dòng thứ hai chứa xâu ~s~ gồm đúng ~n~ chữ cái tiếng Anh thường.

Kết quả

Ghi ra một số nguyên duy nhất là độ dài lớn nhất của một đoạn tín hiệu lặp.

Ví dụ

Ví dụ 1

Input

6
banana

Output

3
Ví dụ 2

Input

10
qwertyuiop

Output

0

Giải thích

Ví dụ 1

Đoạn ~\text{ana}~ xuất hiện tại các vị trí bắt đầu ~2~ và ~4~, nên đáp án ít nhất là ~3~. Không có đoạn lặp nào dài hơn.

Ví dụ 2

Không có ký tự nào xuất hiện hai lần, nên không có đoạn lặp không rỗng.

Ràng buộc và chấm điểm

Ràng buộc
  • ~1 \le n \le 2 \cdot 10^5~.
  • ~s~ chỉ gồm các chữ cái tiếng Anh thường từ ~\text{a}~ đến ~\text{z}~.
Chấm điểm
  • Subtask~1~ ~(25\%)~: ~n \le 500~.
  • Subtask~2~ ~(35\%)~: ~n \le 5000~.
  • Subtask~3~ ~(40\%)~: không có ràng buộc bổ sung.

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.