#include <bits/stdc++.h>
const int maxn = 2e6 + 10;
int n, m;
char str[maxn];
struct Suffix_Automaton {
  int clk, last, nodecnt;
  int a[maxn];
  int c[maxn];
  int len[maxn];
  int vis[maxn];
  int size[maxn];
  int fail[maxn];
  int nxt[maxn][26];
  void init() { last = nodecnt = 1; }
  void extend(int c) {
    int np = ++nodecnt, p = last;
    size[np] = 1;
    len[last = np] = len[p] + 1;
    while (p && nxt[p][c] == 0) nxt[p][c] = np, p = fail[p];
    if (p == 0)
      fail[np] = 1;
    else {
      int q = nxt[p][c];
      if (len[q] == len[p] + 1)
        fail[np] = q;
      else {
        int nq = ++nodecnt;
        len[nq] = len[p] + 1;
        fail[nq] = fail[q];
        fail[q] = fail[np] = nq;
        memcpy(nxt[nq], nxt[q], sizeof(nxt[nq]));
        while (nxt[p][c] == q) nxt[p][c] = nq, p = fail[p];
      }
    }
  }
  void radixsort() {
    for (int i = 1; i <= nodecnt; i++) ++c[len[i]];
    for (int i = 1; i <= nodecnt; i++) c[i] += c[i - 1];
    for (int i = nodecnt; i >= 1; i--) a[c[len[i]]--] = i;
    for (int i = nodecnt; i >= 1; i--) size[fail[a[i]]] += size[a[i]];
  }
  int count() {
    ++clk;
    int ret = 0;
    for (int i = 1; i <= n; i++) str[i + n] = str[i];
    for (int i = 1, cur = 1, now = 0; i <= (n << 1); i++) {
      if (nxt[cur][str[i] - 'a'])
        cur = nxt[cur][str[i] - 'a'], ++now;
      else {
        while (cur && nxt[cur][str[i] - 'a'] == 0) now = len[cur = fail[cur]];
        if (cur == 0)
          cur = 1;
        else
          cur = nxt[cur][str[i] - 'a'], ++now;
      }
      while (cur && len[fail[cur]] >= n) now = len[cur = fail[cur]];
      if (now >= n && vis[cur] != clk) vis[cur] = clk, ret += size[cur];
    }
    return ret;
  }
} sam;
int main() {
  sam.init();
  scanf("%s%d", str + 1, &m);
  n = strlen(str + 1);
  for (int i = 1; i <= n; i++) sam.extend(str[i] - 'a');
  sam.radixsort();
  while (m--) {
    scanf("%s", str + 1);
    n = strlen(str + 1);
    printf("%d\n", sam.count());
  }
  return 0;
}
