canuc80k1901·2/50

Những Điểm Khớp

Nộp bài trên LQDOJ

Bài 19 · Hashing

Cho một văn bản và một mẫu . Hãy tìm mọi chỉ số theo hệ sao cho đoạn gồm ký tự của bắt đầu tại bằng đúng .

Các lần xuất hiện chồng lấn vẫn được tính. Ví dụ, mẫu aa xuất hiện ba lần trong aaaa, tại các vị trí .

Input

  • Dòng đầu chứa văn bản .
  • Dòng thứ hai chứa mẫu .

Output

  • In mỗi vị trí hợp lệ trên một dòng, theo thứ tự tăng dần. Nếu mẫu không xuất hiện, không in gì.

Constraints

  • .
  • .
  • Mỗi ký tự của và là chữ cái Latin hoặc chữ số. Chữ hoa và chữ thường được xem là hai ký tự khác nhau.

Scoring

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

Example

Test 1

Input

ababaabababa
aba

Output

0
2
5
7
9

Giải thích: Các đoạn dài bắt đầu tại đều bằng aba. Các lần ở gần nhau vẫn được tính vì chúng được phép chồng lấn.

Lời giải tóm tắt
  • Phân tích: So sánh trực tiếp mẫu với từng cửa sổ có thể tốn O(|T||P|). Prefix hash cho phép lấy dấu vân tay của một đoạn bất kỳ trong O(1) sau khi tiền xử lý.
  • Thuật toán: Xây hai hash tiền tố với hai modulo cho T và P. Với mỗi i từ 0 đến |T|-|P|, lấy hash chuẩn hóa của T[i..i+|P|) và so với hash của toàn bộ P; nếu bằng nhau thì in i.
  • Chứng minh: Thuật toán xét đúng mọi chỉ số mà mẫu có thể nằm trọn trong văn bản. Khi cửa sổ bằng mẫu, hai hash chắc chắn bằng nhau nên vị trí được in. Ngược lại, một vị trí chỉ được in khi cả hai dấu vân tay trùng; với double hash, đây là phép kiểm tra xác suất có sai số va chạm cực nhỏ.
  • Độ phức tạp: Thời gian O(|T|+|P|), bộ nhớ O(|T|+|P|).