#include <bits/stdc++.h>
using namespace std;
const int oo = 0x3f3f3f3f;
const double eps = 1e-9;
int N, K;
int T, risk[22], A[22][22], tab[1 << 22][2];
int mask[22];
char S[250000];
int mark;
int main() {
  scanf("%d%d%d", &N, &K, &T);
  scanf("%s", S);
  for (int i = (0); i < (K); i++) scanf("%d", &risk[i]);
  for (int i = (0); i < (K); i++)
    for (int j = (0); j < (K); j++) scanf("%d", &A[i][j]);
  memset(mask, -1, sizeof(mask));
  for (int i = (0); i < (N); i++) {
    mark |= (1 << (S[i] - 'A'));
    for (int j = (0); j < (K); j++) {
      if (mask[j] == -1) continue;
      int a = j, b = S[i] - 'A';
      if ((mask[j] & (1 << a)) || (mask[j] & (1 << b))) continue;
      tab[mask[j]][0] += A[a][b];
      tab[mask[j] | (1 << a)][0] -= A[a][b];
      tab[mask[j] | (1 << b)][0] -= A[a][b];
      tab[mask[j] | (1 << a) | (1 << b)][0] += A[a][b];
    }
    for (int j = (0); j < (K); j++) {
      int a = j, b = S[i] - 'A';
      if (a == b) {
        mask[a] = 0;
      } else if (mask[j] != -1) {
        mask[a] |= (1 << b);
      }
    }
  }
  for (int i = (0); i < (K); i++) {
    for (int j = (0); j < (1 << K); j++) {
      tab[j | (1 << i)][(i + 1) & 1] += tab[j][i & 1];
      if (!(j & (1 << i))) tab[j][(i + 1) & 1] += tab[j][i & 1];
    }
    for (int j = (0); j < (1 << K); j++) tab[j][i & 1] = 0;
  }
  int res = 0;
  for (int i = (0); i < (1 << K); i++) {
    if ((~mark) & i) continue;
    int v = tab[i][K & 1];
    bool alldel = true;
    for (int j = (0); j < (K); j++) {
      if ((mark & (1 << j)) && ((i & (1 << j)))) v += risk[j];
      if ((mark & (1 << j)) && !((i & (1 << j)))) alldel = false;
    }
    if (v <= T && !alldel) {
      res++;
    }
  }
  cout << res << endl;
  return 0;
}
