#ifdef _WIN32 # define LL "%I64d" #else # define LL "%Ld" #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define null NULL #define mp make_pair #define pb(a) push_back(a) #define sz(a) ((int)(a).size()) #define all(a) a.begin() , a.end() #define fi first #define se second #define relaxMin(a , b) (a) = min((a),(b)) #define relaxMax(a , b) (a) = max((a),(b)) #define SQR(a) ((a)*(a)) typedef vector vi; typedef pair pii; typedef long long ll; #define SZ 500010 #define ALP 26 struct node{ int cnt; int len , link; int fo[ALP]; void init(){ cnt = 0; memset(fo , -1 , sizeof fo); } }; node A[2*SZ]; int br , last; void init(){ br=1; last=0; A[0].init(); A[0].len = 0; A[0].link = -1; } void sa_extend(char w){ int cur = br++ , p; A[cur].init(); A[cur].len = A[last].len+1; A[cur].cnt = 1; for(p=last;p!=-1 && A[p].fo[w]==-1;p = A[p].link) A[p].fo[w] = cur; if(p==-1)A[cur].link = 0; else{ int q = A[p].fo[w]; if(A[p].len+1 == A[q].len)A[cur].link = q; else{ int clone = br++; A[clone].init(); // Dobavil i ne proveril A[clone].len = A[p].len+1; A[clone].link = A[q].link; memcpy(A[clone].fo , A[q].fo , sizeof A[q].fo); for(;p!=-1 && A[p].fo[w]==q;p=A[p].link) A[p].fo[w] = clone; A[q].link = A[cur].link = clone; } } last = cur; } char in[SZ]; vi by_len[SZ]; void create(){ init(); int l = strlen(in); for(int i=0;i= 0;--i){ vi& cur = by_len[i]; for(int j = 0;j < sz(cur);++j){ int vr = cur[j]; if(A[vr].link >= 0) A[A[vr].link].cnt += A[vr].cnt; } } } // Solution int main(){ freopen("clown.in", "r", stdin); freopen("clown.out", "w", stdout); //cout << sizeof(A) << endl; scanf("%s", in); //for(int i = 0;i < 500000;++i) // in[i] = 'a' + rand()%7; create(); //printf("%.3f\n",(clock() - 0.0)/CLOCKS_PER_SEC); int m; scanf("%d", &m); for(int q = 0;q < m;++q){ scanf("%s", in); int l = strlen(in); int vr = 0; for(int i = 0;i < l;++i){ char c = in[i] - 'a'; vr = A[vr].fo[c]; if(vr == -1) break; } if(vr == -1) printf("%d\n", 0); else printf("%d\n", A[vr].cnt); } return 0; }