canuc80k7302·3/40

Vị Trí Đầu Tiên

Nộp bài trên LQDOJ

Bài 73 · Aho Corasick

Cho một văn bản và một danh sách mẫu. Một mẫu xuất hiện khi nó bằng một đoạn ký tự liên tiếp của văn bản. Các lần xuất hiện có thể chồng lấn.

Với mỗi mẫu, tìm vị trí bắt đầu nhỏ nhất theo chỉ số mà mẫu xuất hiện trong văn bản; nếu không có thì trả về .

Input

  • Dòng đầu chứa văn bản .
  • Dòng thứ hai chứa số nguyên .
  • dòng tiếp theo, mỗi dòng chứa một mẫu.

Output

  • In dòng; dòng thứ là vị trí bắt đầu nhỏ nhất của mẫu thứ , hoặc nếu mẫu không xuất hiện.

Constraints

  • .
  • .
  • Tổng độ dài của mẫu không vượt quá .
  • Văn bản và mọi mẫu chỉ gồm các chữ cái thường đến .

Scoring

  • Subtask ( điểm): test nhỏ, phù hợp với cách đối chiếu trực tiếp từng mẫu.
  • Subtask ( điểm): test không có giới hạn bổ sung.

Example

Test 1

Input

cababa
4
aba
cab
bb
a

Output

2
1
-1
2

Giải thích: cab bắt đầu ở vị trí , còn occurrence đầu tiên của aba và cùng bắt đầu ở vị trí . Mẫu bb không xuất hiện nên nhận giá trị .

Lời giải tóm tắt
  • Ý tưởng: Lưu vị trí kết thúc nhỏ nhất của mỗi trạng thái khi quét; sau đó dồn phép min theo failure link và đổi sang vị trí bắt đầu.
  • Tính đúng đắn: Sau khi đọc một tiền tố của văn bản, trạng thái automaton biểu diễn hậu tố dài nhất đồng thời là tiền tố của một mẫu. Mọi mẫu kết thúc tại vị trí hiện tại nằm đúng trên chuỗi failure của trạng thái đó; vì vậy thao tác dồn hoặc chuỗi liên kết báo cáo xét đủ và chỉ các occurrence hợp lệ. Kết quả được xuất theo terminal của từng mục đầu vào nên giữ nguyên thứ tự và cả các mục trùng nhau.
  • Độ phức tạp: O(|S| + L + k) thời gian và O(L) bộ nhớ.