// Code By CloudySky #include<bits/stdc++.h> // #define int long long namespace IO // namespace IO usingnamespace IO; constint Maxn = 2e6 + 10; usingnamespace std; char s[Maxn]; int sam[Maxn][26], siz[Maxn], len[Maxn], fail[Maxn], lst, tot; voidinsert(char c){ int p = lst, np = ++tot, ch = c - 'a'; lst = np, len[np] = len[p] + 1, siz[np] = 1; for (; p != -1 && !sam[p][ch]; p = fail[p]) sam[p][ch] = np; if (p == -1) return fail[np] = 0, void(); int q = sam[p][ch]; if (len[q] == len[p] + 1) return fail[np] = q, void(); int nq = ++tot; fail[nq] = fail[q], fail[q] = fail[np] = nq; memcpy(sam[nq], sam[q], sizeof(sam[nq])); len[nq] = len[p] + 1; for (; p != -1 && sam[p][ch] == q; p = fail[p]) sam[p][ch] = nq; } voidSAM(){ fail[0] = -1, lst = tot = 0; int n = strlen(s); for (int i = 0; i < n; ++i) insert(s[i]); staticint cnt[Maxn], id[Maxn]; for (int i = 0; i <= tot; ++i) ++cnt[len[i]]; for (int i = 0; i <= tot; ++i) cnt[i] += cnt[i - 1]; for (int i = 0; i <= tot; ++i) id[--cnt[len[i]]] = i; for (int i = tot; i; --i) siz[fail[id[i]]] += siz[id[i]]; print(tot + 1); }
char t[Maxn]; int vis[Maxn]; voidsolve(int tim){ scanf("%s", t + 1); int n = strlen(t + 1), k = 0, p = 0; longlong ans = 0; for (int i = 1; i <= n; ++i) { int ch = t[i] - 'a'; while (p != 0 && !sam[p][ch]) k = len[p = fail[p]]; if (sam[p][ch]) p = sam[p][ch], ++k; } for (int i = 1; i <= n; ++i) { int ch = t[i] - 'a'; if (k == n) { if (vis[p] != tim) ans += siz[p], vis[p] = tim; if (--k == len[fail[p]]) p = fail[p]; } while (p != 0 && !sam[p][ch]) k = len[p = fail[p]]; if (sam[p][ch]) p = sam[p][ch], ++k; } print(ans); } signedmain(){ scanf("%s", s), SAM(); int m = read(); for (int i = 1; i <= m; ++i) solve(i); return0; }