#include <bits/stdc++.h>
using namespace std;
int n, m, k;
bool debug = false;
int T, t[25], a[25][25];
long long v[1 << 22];
bool bl[1 << 22];
char s[200005];
int main() {
  int all = 0;
  scanf("%d%d%d", &n, &k, &T);
  scanf("%s", s);
  for (int i = 0; i < k; i++) scanf("%d", t + i);
  for (int i = 0; i < k; i++)
    for (int j = 0; j < k; j++) {
      scanf("%d", &a[i][j]);
    }
  queue<int> pos[25];
  for (int i = 0; i < n; i++) {
    int ii = s[i] - 'A';
    all |= 1 << ii;
    pos[ii].push(i);
  }
  set<int> aa;
  for (int i = 0; i < n; i++) {
    int num = s[i] - 'A';
    aa.clear();
    for (int j = 0; j < k; j++)
      if (pos[j].size()) {
        if (pos[j].front() <= i) {
          pos[j].pop();
        }
        if (pos[j].size()) {
          aa.insert(pos[j].front());
        }
      }
    int m1 = 0;
    for (int x : aa) {
      if ((m1 >> num) & 1) {
        break;
      }
      int num1 = s[x] - 'A';
      int cost = a[num][num1];
      v[m1] += cost;
      v[m1 | 1 << num] -= cost;
      v[m1 | 1 << num1] -= cost;
      v[m1 | 1 << num | 1 << num1] += cost;
      m1 |= (1 << num1);
    }
  }
  for (int j = 0; j < k; j++) {
    for (int i = 0; i < 1 << k; i++) {
      if ((i >> j) & 1) {
        v[i] += v[i ^ (1 << j)];
      }
    }
  }
  int ans = 0;
  for (int i = 0; i < 1 << k; i++) {
    long long tmp = v[i], allt = all;
    for (int j = 0; j < k; j++) {
      if ((i >> j) & 1) {
        if ((allt >> j) & 1) {
          tmp += t[j];
          allt -= 1 << j;
        }
      }
    }
    if (allt && !bl[allt] && tmp <= T) {
      ans++;
      bl[allt] = 1;
    }
  }
  printf("%d\n", ans);
  return 0;
}
