#include <bits/stdc++.h>
using namespace std;
template <class T>
void UniqeVector(vector<T>& v) {
  sort(v.begin(), v.end());
  v.erase(unique(v.begin(), v.end()), end(v));
}
template <class A>
void re(complex<A>& c);
template <class A, class B>
void re(pair<A, B>& p);
template <class A>
void re(vector<A>& v);
template <class A, size_t SZ>
void re(array<A, SZ>& a);
template <class T>
void re(T& x) {
  cin >> x;
}
void re(double& d) {
  string t;
  re(t);
  d = stod(t);
}
void re(long double& d) {
  string t;
  re(t);
  d = stold(t);
}
template <class H, class... T>
void re(H& h, T&... t) {
  re(h);
  re(t...);
}
template <class A>
void re(complex<A>& c) {
  A a, b;
  re(a, b);
  c = {a, b};
}
template <class A, class B>
void re(pair<A, B>& p) {
  re(p.f, p.s);
}
template <class A>
void re(vector<A>& x) {
  for (auto& a : x) re(a);
}
template <class A, size_t SZ>
void re(array<A, SZ>& x) {
  for (auto& a : x) re(a);
}
string to_string(char c) { return string(1, c); }
string to_string(const char* s) { return (string)s; }
string to_string(string s) { return s; }
string to_string(bool b) { return to_string((int)b); }
template <class A>
string to_string(complex<A> c) {
  stringstream ss;
  ss << c;
  return ss.str();
}
string to_string(vector<bool> v) {
  string res = "{";
  for (int i = (0); ((1) > 0 ? i < ((int)v.size()) : i > ((int)v.size()));
       i += (1))
    res += char('0' + v[i]);
  res += "}";
  return res;
}
template <size_t SZ>
string to_string(bitset<SZ> b) {
  string res = "";
  for (int i = (0); ((1) > 0 ? i < (SZ) : i > (SZ)); i += (1))
    res += char('0' + b[i]);
  return res;
}
template <class A, class B>
string to_string(pair<A, B> p);
template <class T>
string to_string(T v) {
  bool fst = 1;
  string res = "";
  for (const auto& x : v) {
    if (!fst) res += " ";
    fst = 0;
    res += to_string(x);
  }
  return res;
}
template <class A, class B>
string to_string(pair<A, B> p) {
  return to_string(p.f) + " " + to_string(p.s);
}
template <class A>
void pr(A x) {
  cout << to_string(x);
}
template <class H, class... T>
void pr(const H& h, const T&... t) {
  pr(h);
  pr(t...);
}
void ps() { pr("\n"); }
template <class H, class... T>
void ps(const H& h, const T&... t) {
  pr(h);
  if (sizeof...(t)) pr(" ");
  ps(t...);
}
void prsz(vector<int>& v) {
  pr((int)v.size(), '\n');
  pr(v);
}
const int di[8] = {0, 0, 1, -1, 1, 1, -1, -1};
const int dj[8] = {1, -1, 0, 0, 1, -1, 1, -1};
const int SZ = 26;
const char BaseCase = 'a';
struct node {
  node* nxt[SZ] = {};
};
node* root = new node();
string s;
int n;
void add(const string& s) {
  node* cur = root;
  for (char c : s) {
    c -= BaseCase;
    if (cur->nxt[c] == nullptr) cur->nxt[c] = new node();
    cur = cur->nxt[c];
  }
}
int ans = 0;
void del(node* u) {
  for (int i = 0; i < SZ; ++i) {
    if (u->nxt[i] != nullptr) {
      ++ans;
      del(u->nxt[i]);
    }
  }
  delete u;
}
void Suhaib_Sawalha() {
  set<string> st;
  string s;
  re(s);
  char c;
  bool bad[26] = {};
  for (int i = (0); ((1) > 0 ? i < (26) : i > (26)); i += (1)) {
    re(c);
    bad[i] = (c - '0') ^ 1;
  }
  int k, n = (int)s.size();
  re(k);
  for (int i = (0); ((1) > 0 ? i < (n) : i > (n)); i += (1)) {
    string w = "";
    int cnt = 0;
    for (int j = (i); (((i) < (n) ? 1 : -1) > 0 ? j < (n) : j > (n));
         j += ((i) < (n) ? 1 : -1)) {
      w += s[j];
      cnt += bad[s[j] - 'a'];
      if (cnt > k) {
        w.pop_back();
        add(w);
        break;
      }
      if (j == n - 1) {
        add(w);
      }
    }
  }
  del(root);
  pr(ans);
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  Suhaib_Sawalha();
  return 0;
}
