#include <bits/stdc++.h>
using namespace std;
const int N = 1000009;
const int SGZ = 26;
const int M = 10009;
int n, m, nxt[N][SGZ], crt[N][SGZ], q[M], ans[M];
vector<int> val;
char s[N], qy[SGZ];
inline int read() {
  char c = getchar();
  int ret = 0, f = 1;
  while (c < '0' || c > '9') {
    f = c == '-' ? -1 : 1;
    c = getchar();
  }
  while ('0' <= c && c <= '9') {
    ret = ret * 10 + c - '0';
    c = getchar();
  }
  return ret * f;
}
inline int index(int x) {
  for (int l = 0, r = val.size() - 1, mid; l <= r;) {
    mid = l + r >> 1;
    if (val[mid] == x) {
      return mid;
    } else if (val[mid] < x) {
      l = mid + 1;
    } else {
      r = mid - 1;
    }
  }
  return -1;
}
int main() {
  scanf("%s", s);
  n = strlen(s);
  m = read();
  for (int i = 1; i <= m; i++) {
    scanf("%s", qy);
    int len = strlen(qy);
    for (int j = 0; j < len; j++) {
      q[i] |= 1 << qy[j] - 'a';
    }
    val.push_back(q[i]);
  }
  sort(val.begin(), val.end());
  val.resize(unique(val.begin(), val.end()) - val.begin());
  int last_position[SGZ];
  fill(last_position, last_position + SGZ, n);
  for (int i = n - 1; ~i; i--) {
    last_position[s[i] - 'a'] = i;
    for (int j = 0; j < SGZ; j++) {
      nxt[i][j] = last_position[j];
    }
  }
  memset(crt, -1, sizeof(crt));
  for (int i = 0; i < n; i++) {
    for (int j = 0, p = i, sta = 0; j < 26 && p < n; j++) {
      int np = n, c = -1;
      for (int k = 0; k < 26; k++) {
        if ((sta >> k & 1) == 0) {
          if (np > nxt[p][k]) {
            c = k;
            np = nxt[p][k];
          }
        }
      }
      if (~c) {
        sta |= 1 << c;
        p = np;
        crt[i][j] = sta;
        if (!i || crt[i - 1][j] != sta) {
          int idx = index(sta);
          if (~idx) {
            ans[idx]++;
          }
        }
      }
    }
  }
  for (int i = 1; i <= m; i++) {
    printf("%d\n", ans[index(q[i])]);
  }
  return 0;
}
