#include <bits/stdc++.h>
unsigned char mask[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
int Lv[1000002];
int n, k;
bool cmp_Lv(const int i, const int j) { return Lv[i] < Lv[j]; }
bool cmp(const int i, const int j) {
  if (Lv[i] != Lv[j]) {
    return Lv[i] < Lv[j];
  }
  int L_i = (i + k >= n ? -1 : Lv[i + k]);
  int L_j = (j + k >= n ? -1 : Lv[j + k]);
  return L_i < L_j;
}
int main() {
  int A[1000002];
  char c[1000002];
  scanf("%s", c);
  std::string T = std::string(c);
  n = T.size();
  unsigned char *t;
  t = new unsigned char[(n >> 3) + 1];
  bool act;
  int l, r;
  int i;
  for (i = 0; i < n; i++) {
    A[i] = i;
  }
  for (i = 0; i < n; i++) {
    Lv[i] = T[i];
  }
  unsigned char bkt[129];
  for (i = 0; i < 129; i++) {
    bkt[i] = 0;
  }
  for (i = 0; i < n; i++) {
    bkt[Lv[i]]++;
  }
  int sum = 0;
  for (i = 0; i < 129; i++) {
    sum += bkt[i];
    bkt[i] = sum;
  }
  for (i = 0; i < n; i++) {
    A[--bkt[Lv[i]]] = i;
  }
  for (i = 1; i < n; i++) {
    t[i >> 3] = (Lv[A[i]] != Lv[A[i - 1]] ? t[i >> 3] | mask[i & 7]
                                          : t[i >> 3] & ~mask[i & 7]);
  }
  t[n >> 3] = t[n >> 3] | mask[n & 7];
  Lv[A[0]] = 0;
  for (i = 1; i < n; i++) {
    Lv[A[i]] = Lv[A[i - 1]] + !!(mask[i & 7] & t[i >> 3]);
  }
  k = 1;
  while (1) {
    if (k > n) break;
    act = true;
    for (i = 1; i <= n; i++) {
      if (act) {
        if (!!(mask[i & 7] & t[i >> 3])) {
          continue;
        } else {
          l = i - 1;
          act = false;
        }
      } else {
        if (!!(mask[i & 7] & t[i >> 3])) {
          r = i;
          std::sort(A + l, A + r, cmp);
          act = true;
        } else {
          continue;
        }
      }
    }
    for (i = 1; i < n; i++) {
      t[i >> 3] = (cmp(A[i - 1], A[i]) ? t[i >> 3] | mask[i & 7]
                                       : t[i >> 3] & ~mask[i & 7]);
    }
    t[n >> 3] = t[n >> 3] | mask[n & 7];
    Lv[A[0]] = 0;
    for (i = 1; i < n; i++) {
      Lv[A[i]] = Lv[A[i - 1]] + !!(mask[i & 7] & t[i >> 3]);
    }
    if (Lv[A[n - 1]] == n - 1) break;
    k <<= 1;
  };
  char p[1000];
  int q, left, right, mid, crit;
  bool exist;
  scanf("%d", &q);
  A[n] = n;
  while (q) {
    scanf("%s", p);
    std::string P = std::string(p);
    left = 0, right = n, exist = false;
    while (left < right) {
      if (n < P.size()) {
        exist = false;
        break;
      }
      mid = (left + right) / 2;
      crit = T.compare(A[mid], P.size(), P);
      if (crit > 0) {
        right = mid;
      } else if (crit < 0) {
        left = mid + 1;
      } else {
        exist = true;
        break;
      }
    };
    if (T.compare(A[right], P.size(), P) == 0) exist = true;
    if (exist) {
      printf("1\n");
    } else {
      printf("0\n");
    }
    q--;
  }
  return 0;
}
