#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mx = 1e6 + 5;
// --- CẤU HÌNH DOUBLE HASH ---
// Dùng 2 bộ (Base, Mod) khác nhau để xác suất va chạm (Collision) gần như bằng 0.
// Nếu chỉ dùng 1 bộ, các test hiểm của CSES sẽ đánh lừa được thuật toán.
const ll MOD1 = 1e9 + 7;
const ll BASE1 = 311; // Chọn số nguyên tố lớn hơn bảng chữ cái (256)
const ll MOD2 = 1e9 + 9;
const ll BASE2 = 317;
string t, p; // t: Text (văn bản), p: Pattern (mẫu)
// pw: Mảng lưu lũy thừa của Base (Base^0, Base^1, ...)
// h: Mảng lưu giá trị Hash tiền tố (Prefix Hash)
ll pw1[mx], h1[mx];
ll pw2[mx], h2[mx];
// Hàm xây dựng bảng Hash cho chuỗi T
void build_hash() {
int n = t.size();
// Khởi tạo cơ sở
pw1[0] = pw2[0] = 1; // Base^0 luôn bằng 1
h1[0] = h2[0] = 0; // Hash của chuỗi rỗng là 0
for(int i = 0; i < n; ++i) {
// 1. Tính trước các lũy thừa của Base
// pw[i+1] = pw[i] * Base
pw1[i+1] = (pw1[i] * BASE1) % MOD1;
pw2[i+1] = (pw2[i] * BASE2) % MOD2;
// 2. Tính Hash cộng dồn (Rolling Hash)
// Tư duy giống hệ thập phân: "45" -> thêm số 1 -> "451"
// Ta lấy số cũ (45) nhân 10 (Base) rồi cộng số mới (1)
h1[i+1] = (h1[i] * BASE1 + t[i]) % MOD1;
h2[i+1] = (h2[i] * BASE2 + t[i]) % MOD2;
}
}
// Hàm lấy giá trị Hash của đoạn con từ i đến j
// Lưu ý: i, j ở đây là chỉ số 1-based (theo mảng h và pw)
pair<ll, ll> get_hash(int i, int j) {
int len = j - i + 1; // Độ dài đoạn cần cắt
// CÔNG THỨC QUAN TRỌNG:
// Hash(đoạn) = Hash(cuối) - Hash(đầu_thừa) * Base^len
// Ví dụ: Lấy "51" từ "4512".
// Hash("451") - Hash("4") * 10^2 = 451 - 400 = 51.
// Tính bộ 1:
ll v1 = (h1[j] - h1[i-1] * pw1[len] % MOD1 + MOD1) % MOD1;
// Giải thích đoạn "+ MOD1":
// Phép trừ (A - B) % M có thể ra số âm nếu A < B (do A đã bị mod trước đó).
// Cộng thêm MOD để đảm bảo kết quả luôn dương.
// Tính bộ 2:
ll v2 = (h2[j] - h2[i-1] * pw2[len] % MOD2 + MOD2) % MOD2;
return {v1, v2}; // Trả về cặp hash để so sánh
}
int main() {
cin.tie(0)->sync_with_stdio(0);
if(fopen("String_Matching.inp", "r")) {
freopen("String_Matching.inp", "r", stdin);
freopen("String_Matching.out", "w", stdout);
}
cin >> t >> p;
int n = t.size();
int m = p.size();
// Nếu mẫu dài hơn văn bản thì không bao giờ tìm thấy
if(m > n) {
cout << 0;
return 0;
}
// Bước 1: Dựng hash cho văn bản T
build_hash();
// Bước 2: Tính hash thủ công cho mẫu P
// Vì P ngắn và cố định, ta tính 1 lần duy nhất, không cần lưu mảng
ll hp1 = 0, hp2 = 0;
for(char c : p) {
hp1 = (hp1 * BASE1 + c) % MOD1;
hp2 = (hp2 * BASE2 + c) % MOD2;
}
int ans = 0;
// Bước 3: Cửa sổ trượt (Sliding Window)
// Duyệt qua tất cả các đoạn con có độ dài bằng m trong T
for(int i = 0; i <= n - m; ++i) {
// Lấy Hash đoạn T[i ... i+m-1]
// Vì mảng hash h1, h2 mình xây dựng theo chỉ số 1 (h[1] là ký tự đầu)
// Nên khi gọi get_hash phải cộng thêm 1 vào index: (i+1, i+m)
pair<ll, ll> curr = get_hash(i + 1, i + m);
// Kiểm tra xem Hash đoạn này có bằng Hash của mẫu P không
// Phải khớp cả 2 bộ hash mới tính là đúng
if(curr.first == hp1 && curr.second == hp2) {
ans++;
}
}
cout << ans;
return 0;
}