#include <bits/stdc++.h>
using namespace std;
const int MaxN = 2000010, MaxC = 27, MaxM = 1000010;
struct Node {
  int Ch[MaxC], L, Fail;
} SAM[MaxN];
int Total = 1, N, Num[MaxN], H[MaxN], Cnt[MaxN], Last = 1, Time[MaxN];
char S[MaxN];
void Extend(int C, int Pos) {
  int Now = ++Total, P;
  SAM[Now].L = Pos;
  for (P = Last; P && !SAM[P].Ch[C]; P = SAM[P].Fail) SAM[P].Ch[C] = Now;
  Last = Now;
  if (P) {
    int Q = SAM[P].Ch[C];
    if (SAM[Q].L == SAM[P].L + 1)
      SAM[Now].Fail = Q;
    else {
      int New = ++Total;
      SAM[New] = SAM[Q];
      SAM[Q].Fail = SAM[Now].Fail = New;
      SAM[New].L = SAM[P].L + 1;
      for (; SAM[P].Ch[C] == Q; P = SAM[P].Fail) SAM[P].Ch[C] = New;
    }
  } else
    SAM[Now].Fail = 1;
}
void Calc() {
  for (int i = 1; i <= Total; i++) Cnt[SAM[i].L]++;
  for (int i = 1; i <= N; i++) Cnt[i] += Cnt[i - 1];
  for (int i = 1; i <= Total; i++) H[Cnt[SAM[i].L]--] = i;
  for (int i = Last; i; i = SAM[i].Fail) Num[i]++;
  for (int i = Total; i; i--)
    for (int j = 0; j < 26; j++) Num[H[i]] += Num[SAM[H[i]].Ch[j]];
}
void Solve(int Q) {
  static char S[MaxM * 2];
  scanf("%s", S + 1);
  int M = strlen(S + 1), Now = 1, Len = 0;
  long long Ans = 0;
  for (int i = 1; i <= M; i++) S[i + M] = S[i];
  for (int i = 1; i <= M * 2 - 1; i++) {
    while (Now && !SAM[Now].Ch[S[i] - 'a']) {
      Now = SAM[Now].Fail;
      Len = SAM[Now].L;
    }
    if (Now == 0) Now = 1;
    if (SAM[Now].Ch[S[i] - 'a']) {
      Now = SAM[Now].Ch[S[i] - 'a'];
      Len++;
    }
    while (SAM[SAM[Now].Fail].L >= M) {
      Now = SAM[Now].Fail;
      Len = SAM[Now].L;
    }
    if (Len >= M)
      if (Time[Now] != Q) {
        Ans += Num[Now];
        Time[Now] = Q;
      }
  }
  printf("%I64d\n", Ans);
}
int main() {
  scanf("%s", S + 1);
  N = strlen(S + 1);
  for (int i = 1; i <= N; i++) Extend(S[i] - 'a', i);
  Calc();
  int Q;
  scanf("%d", &Q);
  while (Q--) Solve(Q + 1);
  return 0;
}
