#include <bits/stdc++.h>
using namespace std;
struct Data {
  int Pos, Number;
};
bool operator<(Data A, Data B) { return A.Pos < B.Pos; }
int Total;
int Seq[26000000];
int Small(int X) {
  if (!Total) return 0;
  if (Seq[0] >= X) return 0;
  int Left = 0, Right = Total - 1;
  while (Left < Right) {
    int Mid = (Left + Right + 1) / 2;
    if (Seq[Mid] < X)
      Left = Mid;
    else
      Right = Mid - 1;
  }
  return Left + 1;
}
int Big(int X) {
  if (!Total) return 0;
  if (Seq[Total - 1] <= X) return 0;
  int Left = 0, Right = Total - 1;
  while (Left < Right) {
    int Mid = (Left + Right) / 2;
    if (Seq[Mid] > X)
      Right = Mid;
    else
      Left = Mid + 1;
  }
  return Total - Left;
}
int main() {
  int N = 0;
  char c;
  static int A[1000000];
  while (c = getchar(), c >= 'a' && c <= 'z') A[N++] = c - 97;
  static int Next[1000001][26];
  for (int i = 0; i < 26; i++) Next[N][i] = N;
  for (int i = N - 1; i >= 0; i--)
    for (int j = 0; j < 26; j++) Next[i][j] = (A[i] == j) ? i : Next[i + 1][j];
  for (int i = Total = 0; i < N; i++) {
    int M = 0;
    static Data X[26];
    for (int j = 0; j < 26; j++)
      if (Next[i][j] != N) X[M++] = (Data){Next[i][j], j};
    sort(X, X + M);
    int Mask = 0;
    for (int j = 0; j < M; j++) {
      if (Mask) Seq[Total++] = Mask;
      if (i && X[j].Number == A[i - 1]) break;
      Mask |= 1 << X[j].Number;
    }
    if (i && Next[i][A[i - 1]] < N) continue;
    Seq[Total++] = Mask;
  }
  sort(Seq, Seq + Total);
  int Query;
  scanf("%d", &Query);
  getchar();
  while (Query--) {
    int Mask = 0;
    char c;
    while (c = getchar(), c >= 'a' && c <= 'z') Mask |= 1 << (c - 97);
    printf("%d\n", Total - Small(Mask) - Big(Mask));
  }
  return 0;
}
