#include <bits/stdc++.h>
using namespace std;
string c, t, s;
const int inf = 1 << 30;
int dp[1001][51][51];
int lpss[51][26], lpst[51][26];
int lps(string a, string b) {
  for (int l = min(a.size(), b.size()); l >= 0; l--) {
    bool valid = true;
    for (int i = 0; i < l; i++)
      if (a[i] != b.end()[i - l]) valid = false;
    if (valid) return l;
  }
}
void fill(string a, int lpsa[51][26]) {
  for (int i = 0; i <= a.size(); i++) {
    string p = a.substr(0, i);
    p.push_back('a');
    for (p.back() = 'a'; p.back() <= 'z'; p.back()++)
      lpsa[i][p.back() - 'a'] = lps(a, p);
  }
}
int fillDP() {
  int cl = c.size(), tl = t.size(), sl = s.size();
  for (int i = 0; i <= cl; i++)
    for (int j = 0; j <= sl; j++)
      for (int k = 0; k <= tl; k++) dp[i][j][k] = -inf;
  dp[0][0][0] = 0;
  for (int i = 0; i < cl; i++)
    for (int j = 0; j <= sl; j++)
      for (int k = 0; k <= tl; k++)
        for (char d1 = 'a'; d1 <= 'z'; d1++) {
          char d = c[i] == '*' ? d1 : c[i];
          int x = lpss[j][d - 'a'], y = lpst[k][d - 'a'];
          dp[i + 1][x][y] =
              max(dp[i + 1][x][y], dp[i][j][k] + (x == sl) - (y == tl));
        }
  int ans = -inf;
  for (int j = 0; j <= sl; j++)
    for (int k = 0; k <= tl; k++) ans = max(ans, dp[cl][j][k]);
  return ans;
}
int main() {
  iostream::sync_with_stdio(false);
  cin >> c >> s >> t;
  fill(s, lpss);
  fill(t, lpst);
  cout << fillDP() << endl;
}
