canuc80k1913·14/50

Đoạn Lặp Dài Nhất

Nộp bài trên LQDOJ

Bài 19 · Hashing

Cho một xâu có độ dài . Một xâu con liên tiếp được gọi là lặp nếu cùng nội dung đó xuất hiện tại ít nhất hai vị trí bắt đầu khác nhau trong .

Hai lần xuất hiện được phép chồng lấn. Ví dụ, trong ababa, xâu aba xuất hiện từ vị trí và , nên vẫn được xem là lặp.

Hãy tìm độ dài lớn nhất của một xâu con lặp. Nếu không có xâu con không rỗng nào xuất hiện ít nhất hai lần, hãy in .

Input

  • Dòng đầu chứa số nguyên .
  • Dòng thứ hai chứa xâu dài đúng .

Output

  • In một số nguyên: độ dài lớn nhất của một xâu con xuất hiện ít nhất hai lần.

Constraints

  • .
  • chỉ gồm chữ cái thường từ đến .

Scoring

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

Example

Test 1

Input

5
ababa

Output

3

Giải thích: Xâu aba dài xuất hiện từ vị trí và ; hai lần xuất hiện chồng lấn tại một ký tự nhưng vẫn hợp lệ. Không có xâu con dài nào xuất hiện hai lần.

Lời giải tóm tắt
  • Ý tưởng: Với một độ dài cố định L, xây hash tiền tố của s cho phép lấy dấu vân tay của mọi cửa sổ dài L trong O(1). Đưa các dấu vân tay vào một tập; nếu gặp giá trị đã có thì tồn tại hai lần xuất hiện, kể cả khi hai cửa sổ chồng lấn.
  • Ý tưởng: Tính chất kiểm tra là đơn điệu: nếu một xâu con dài L xuất hiện hai lần thì prefix dài L-1 của hai lần xuất hiện cũng bằng nhau. Vì vậy ta nhị phân độ dài lớn nhất trong [0,n-1] và dùng double hash trong mỗi lần kiểm tra.
  • Ý tưởng: Độ phức tạp: O(n log n) thời gian kỳ vọng và O(n) bộ nhớ.