canuc80k7301·2/40

Sổ Đếm Mẫu

Nộp bài trên LQDOJ

Bài 7.4 · 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, đếm số vị trí bắt đầu mà mẫu xuất hiện như một xâu con liên tiếp của văn bản; các lần xuất hiện được phép chồng lấn.

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à số lần xuất hiện của mẫu thứ .

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

aaaa
3
a
aa
aaa

Output

4
3
2

Giải thích: Trong aaaa, mẫu bắt đầu ở bốn vị trí, aa bắt đầu ở ba vị trí và aaa bắt đầu ở hai vị trí; các lần chồng lấn vẫn được tính.

Lời giải tóm tắt
  • Ý tưởng: Xây automaton Aho-Corasick, đếm số lần trạng thái được ghé khi quét văn bản rồi dồn tần suất theo thứ tự BFS đảo.
  • 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ớ.