Một lần xuất hiện của xâu P trong xâu T là một đoạn ký tự liên tiếp của T bằng đúng P. Các lần xuất hiện có thể chồng lấn nhau. Hãy đếm tổng số lần xuất hiện.
Input
Dòng thứ nhất chứa xâu văn bản T.
Dòng thứ hai chứa xâu mẫu P.
Output
In một số nguyên là số lần P xuất hiện trong T.
Constraints
1≤∣T∣,∣P∣≤106.
Mỗi xâu chỉ gồm các chữ cái thường tiếng Anh.
Scoring
Subtask 1 (50% số điểm): ∣T∣,∣P∣≤80.
Subtask 2 (50% số điểm): Không có giới hạn bổ sung.
Example
Test 1
Input
aaaaabaaaaa
aaa
Output
6
Giải thích: Trong mỗi khối năm ký tự a, mẫu aaa bắt đầu ở ba vị trí liên tiếp, nên hai khối tạo tổng cộng sáu lần xuất hiện.
Lời giải tóm tắt
Phân tích: Đếm số lần xâu mẫu P xuất hiện như một đoạn liên tiếp trong xâu văn bản T; các lần xuất hiện được phép chồng lấn. Prefix-function lưu độ dài tiền tố dài nhất còn có thể tái sử dụng sau mỗi ký tự, nên toàn bộ dữ liệu được xử lý mà không quay lại các vị trí đã loại.
Thuật toán: Xây prefix-function cho mẫu, quét văn bản bằng KMP và tăng biến đếm mỗi khi trạng thái đạt độ dài mẫu; sau đó lùi theo failure link.
Chứng minh: Trong khi quét, trạng thái KMP luôn bằng độ dài tiền tố dài nhất của mẫu hoặc của chính xâu đang xét trùng với hậu tố đã đọc. Mỗi lần lùi chỉ đi qua một border hợp lệ, nên không bỏ sót khả năng nối tiếp; quy tắc ghi nhận và chuyển trạng thái của bài vì thế tạo đúng toàn bộ kết quả cần in. Các kết quả được xử lý theo thứ tự vị trí hoặc độ dài tăng dần như contract yêu cầu, nên không đếm trùng và không đảo thứ tự.
Độ phức tạp: Thuật toán chạy tuyến tính theo tổng kích thước input và dùng bộ nhớ tuyến tính theo xâu được xây prefix-function, ngoài phần output bắt buộc.