#include <bits/stdc++.h>
using namespace std;
vector<int> sa[2];
vector<int> rk[2];
vector<int> lcp[2];
vector<int> tmp;
string ALL[2];
int k;
int sz;
int calc;
inline bool compare(int i, int j) {
  if (rk[calc][i] != rk[calc][j]) {
    return rk[calc][i] < rk[calc][j];
  } else {
    int ri = (i + k < sz) ? rk[calc][i + k] : -1;
    int rj = (j + k < sz) ? rk[calc][j + k] : -1;
    return ri < rj;
  }
}
void buildSA(int c) {
  calc = c;
  vector<int> &s = sa[calc];
  vector<int> &r = rk[calc];
  vector<int> &l = lcp[calc];
  string &str = ALL[calc];
  s.resize(sz + 1);
  r.resize(sz + 1);
  l.resize(sz + 1);
  tmp.resize(sz + 1);
  for (int i = 0; i < sz + 1; i++) {
    s[i] = i;
    r[i] = (i < sz) ? str[i] : -1;
  }
  for (k = 1; k <= sz; k *= 2) {
    int p = 0;
    if (!k) {
      for (int x = 1; x <= sz; x++) {
        if (r[s[p]] != r[s[x]]) {
          sort(s.begin() + p, s.begin() + x, compare);
          p = x;
        }
      }
    }
    sort(s.begin() + p, s.end(), compare);
    tmp[s[0]] = 0;
    for (int i = 1; i <= sz; i++) {
      tmp[s[i]] = tmp[s[i - 1]] + (compare(s[i - 1], s[i]) ? 1 : 0);
    }
    for (int i = 0; i < sz + 1; i++) {
      r[i] = tmp[i];
    }
  }
  int h = 0;
  l[0] = 0;
  for (int i = 0; i < sz; i++) {
    int j = s[r[i] - 1];
    if (h > 0) h--;
    while (i + h < sz && j + h < sz) {
      if (str[i + h] != str[j + h]) break;
      h++;
    }
    l[r[j]] = h;
  }
}
int main() {
  vector<int> pos, ls, a[2];
  cin >> ALL[0];
  string t;
  int fl = (int)ALL[0].length();
  ALL[1].resize(fl);
  a[0].resize(fl);
  a[1].resize(fl);
  reverse_copy(ALL[0].begin(), ALL[0].end(), ALL[1].begin());
  int m;
  cin >> m;
  int nowp = (int)ALL[0].length() + 1;
  for (int i = 0; i < m; i++) {
    pos.push_back(nowp);
    cin >> t;
    ALL[0] += '$';
    ALL[0] += t;
    reverse(t.begin(), t.end());
    ALL[1] += '$';
    ALL[1] += t;
    ls.push_back((int)t.length());
    nowp += ls[i] + 1;
  }
  sz = (int)ALL[0].length();
  buildSA(0);
  buildSA(1);
  int ans = 0;
  for (int i = 0; i < m; i++) {
    if (ls[i] == 1) {
      continue;
    }
    fill(a[0].begin(), a[0].end(), 0);
    fill(a[1].begin(), a[1].end(), 0);
    for (int c = 0; c < 2; c++) {
      int hoge = rk[c][pos[i]];
      int he = ls[i];
      while (he && hoge <= sz) {
        if (sa[c][hoge] + he - 1 < fl) {
          a[c][sa[c][hoge] + he - 1] = max(a[c][sa[c][hoge] + he - 1], he);
        }
        he = min(he, lcp[c][hoge]);
        hoge++;
      }
      hoge = rk[c][pos[i]];
      he = ls[i];
      while (he && hoge >= 0) {
        if (sa[c][hoge] + he - 1 < fl) {
          a[c][sa[c][hoge] + he - 1] = max(a[c][sa[c][hoge] + he - 1], he);
        }
        hoge--;
        he = min(he, lcp[c][hoge]);
      }
    }
    for (int j = 0; j < fl - 1; j++) {
      a[0][j + 1] = max(a[0][j + 1], a[0][j]);
      a[1][j + 1] = max(a[1][j + 1], a[1][j]);
    }
    for (int j = 0; j < fl - 1; j++) {
      a[0][fl - j - 2] = max(a[0][fl - j - 2], a[0][fl - j - 1] - 1);
      a[1][fl - j - 2] = max(a[1][fl - j - 2], a[1][fl - j - 1] - 1);
    }
    for (int j = 0; j < fl - 1; j++) {
      if (a[0][j] && a[1][fl - j - 2] && a[0][j] + a[1][fl - j - 2] >= ls[i]) {
        ans++;
        break;
      }
    }
  }
  cout << ans << endl;
  return 0;
}
