#include int ri() { int n; assert(scanf("%d", &n) == 1); return n; } struct D { int c; bool one_more; bool more; }; int main () { std::string a_, b_; std::cin >> a_ >> b_; std::vector a, b; for (auto c : a_) { if (c == '*') a.back().more = true; else if (c == '?') a.back().one_more = true; else a.push_back({c - 'a', false, false}); } for (auto c : b_) { if (c == '*') b.back().more = true; else if (c == '?') b.back().one_more = true; else b.push_back({c - 'a', false, false}); } int n = a.size(); int m = b.size(); std::vector dp[n + 1]; for (int i = 0; i <= n; i++) dp[i].resize(m + 1, 1000000000); dp[0][0] = 0; for (int i = 0; i <= n; i++) { for (int j = 0; j <= m; j++) { if (i < n && j < m) { int a_add = !a[i].more; int b_add = !b[j].more; int cost = a[i].c != b[j].c; dp[i + a_add][j + b_add] = std::min(dp[i + a_add][j + b_add], dp[i][j] + cost); } if (i < n) { int cost = 1; if (a[i].one_more || a[i].more) cost = 0; else if (j < m && b[j].c == a[i].c && b[j].more) cost = 0; dp[i + 1][j] = std::min(dp[i + 1][j], dp[i][j] + cost); } if (j < m) { int cost = 1; if (b[j].one_more || b[j].more) cost = 0; else if (i < n && a[i].c == b[j].c && a[i].more) cost = 0; dp[i][j + 1] = std::min(dp[i][j + 1], dp[i][j] + cost); } } } std::cout << dp[n][m] << std::endl; return 0; }