#include <bits/stdc++.h>
int dp[4005][4005], nxta[4005][35], nxtb[4005][35];
char a[4005], b[4005];
inline void upd(int &x, int y) {
  if (y < x) x = y;
}
inline void init(char *str, int n, int nxt[][35]) {
  for (int i = 0; i < 26; i++) nxt[n][i] = n;
  for (int i = n - 1; i >= 0; i--) {
    memcpy(nxt[i], nxt[i + 1], 26 << 2);
    nxt[i][str[i] - 'a'] = i;
  }
}
int main() {
  int ti, td, tr, te;
  scanf("%d%d%d%d%s%s", &ti, &td, &tr, &te, a, b);
  int n = strlen(a), m = strlen(b);
  init(a, n, nxta);
  init(b, m, nxtb);
  memset(dp, 0x3f, sizeof(dp));
  dp[0][0] = 0;
  for (int i = 0; i <= n; i++) {
    for (int j = 0; j <= m; j++) {
      if (i < n) upd(dp[i + 1][j], dp[i][j] + td);
      if (j < m) upd(dp[i][j + 1], dp[i][j] + ti);
      if (i < n && j < m) {
        upd(dp[i + 1][j + 1], dp[i][j] + (a[i] != b[j]) * tr);
        int x = nxta[i + 1][b[j] - 'a'], y = nxtb[j + 1][a[i] - 'a'];
        if (x < n && y < m)
          upd(dp[x + 1][y + 1],
              dp[i][j] + te + td * (x - i - 1) + ti * (y - j - 1));
      }
    }
  }
  printf("%d\n", dp[n][m]);
  return 0;
}
