#include <bits/stdc++.h>
using namespace std;
const int N = 1005;
char s[N * N];
int ch[N][20], fa[N], co[N];
int n, nd = 1, top, v[N], q[N];
long long f[2][1 << 14][N];
int init() {
  int l = strlen(s + 1), x = 1;
  for (int i = (int)(1); i <= (int)(l); i++) {
    int c = s[i] - 'a';
    if (!ch[x][c]) ch[x][c] = ++nd;
    x = ch[x][c];
  }
  return x;
}
void build() {
  static int q[N];
  int h = 0, t = 0;
  for (int i = (int)(0); i <= (int)(13); i++)
    if (!ch[1][i])
      ch[1][i] = 1;
    else {
      fa[ch[1][i]] = 1;
      q[++t] = ch[1][i];
    }
  while (h != t) {
    int x = q[++h];
    for (int i = (int)(0); i <= (int)(13); i++)
      if (!ch[x][i])
        ch[x][i] = ch[fa[x]][i];
      else {
        fa[ch[x][i]] = ch[fa[x]][i];
        q[++t] = ch[x][i];
      }
  }
  for (int i = (int)(1); i <= (int)(t); i++) co[q[i]] += co[fa[q[i]]];
}
int cnt[1 << 14];
int main() {
  for (int i = (int)(0); i <= (int)((1 << 14) - 1); i++)
    cnt[i] = cnt[i / 2] + (i & 1);
  scanf("%d", &n);
  for (int i = (int)(1); i <= (int)(n); i++) {
    scanf("%s", s + 1);
    scanf("%d", &v[i]);
    co[init()] += v[i];
  }
  build();
  scanf("%s", s + 1);
  n = strlen(s + 1);
  for (int i = (int)(1); i <= (int)(n); i++)
    if (s[i] == '?') q[++top] = i;
  q[++top] = n + 1;
  static int tr[20][N];
  static long long trc[20][N];
  for (int i = (int)(1); i <= (int)(top); i++)
    for (int j = (int)(1); j <= (int)(nd); j++) {
      int x = j;
      long long v = 0;
      for (int k = (int)(q[i - 1] + 1); k <= (int)(q[i] - 1); k++)
        v += co[x = ch[x][s[k] - 'a']];
      tr[i][j] = x;
      trc[i][j] = v;
    }
  memset(f, 233, sizeof(f));
  f[0][0][1] = 0;
  for (int i = (int)(1); i <= (int)(top); i++) {
    memset(f[1], 233, sizeof(f[1]));
    for (int st = (int)(0); st <= (int)((1 << 14) - 1); st++)
      if (cnt[st] == i - 1)
        for (int j = (int)(1); j <= (int)(nd); j++)
          f[1][st][tr[i][j]] = max(f[1][st][tr[i][j]], f[0][st][j] + trc[i][j]);
    if (i == top) break;
    memset(f[0], 233, sizeof(f[0]));
    for (int st = (int)(0); st <= (int)((1 << 14) - 1); st++)
      if (cnt[st] == i - 1)
        for (int no = (int)(0); no <= (int)(13); no++)
          if (!(st & (1 << no)))
            for (int j = (int)(1); j <= (int)(nd); j++)
              f[0][st | (1 << no)][ch[j][no]] = max(
                  f[0][st | (1 << no)][ch[j][no]], f[1][st][j] + co[ch[j][no]]);
  }
  long long ans = -(1ll << 60);
  for (int i = (int)(0); i <= (int)((1 << 14) - 1); i++)
    for (int j = (int)(1); j <= (int)(nd); j++) ans = max(ans, f[1][i][j]);
  printf("%lld\n", ans);
}
