#include #include #include #include #include #include using namespace std; #define SA_N 220000 #define SA_LN 20 int lg, len, p[SA_LN][SA_N], sa[SA_LN]; int la[SA_N], lb[SA_N], lc[SA_N]; int bucket[SA_N], tla[SA_N], tlb[SA_N], tlc[SA_N]; void constructSA(int *a, int leng) { len = leng; lg = 1; for(int i=0; i M; for(int i=0; i=0; i--) { int wer = (bucket[lb[i]+1]--)-1; tla[wer] = la[i]; tlb[wer] = lb[i]; tlc[wer] = lc[i]; } for(int i=0; i=0; i--) { int wer = (bucket[la[i]]--)-1; tla[wer] = la[i]; tlb[wer] = lb[i]; tlc[wer] = lc[i]; } for(int i=0; i0 && la[i-1]==la[i] && lb[i-1]==lb[i])? p[lg][lc[i-1]] : i; } } lg--; for(int i=0; i=0 && i li[N]; char s[N]; long long d[N]; int main() { int t; scanf("%d", &t); while(t--) { scanf("%s", s); constructSA(s, strlen(s)); // cerr << string(s) << endl; for(int i=0; i<=len+2; i++) li[i].clear(), d[i] = 0; for(int i=0; i= LCP[i]) top--; if(top == 0) L[i] = -1; else L[i] = stk[top-1]; stk[top++] = i; } top = 0; for(int i=len-2; i>=0; i--) { while(top && LCP[stk[top-1]] >= LCP[i]) top--; if(top == 0) R[i] = len-1; else R[i] = stk[top-1]; stk[top++] = i; } for(int i=len; i; i--) { int j = 0; while(j < li[i].size()) { int mini = i; int k = li[i][j]; if(L[k] != -1 && mini > i - LCP[L[k]]) mini = i - LCP[L[k]]; if(R[k] != len-1 && mini > i - LCP[R[k]]) mini = i - LCP[R[k]]; int range = R[k] - L[k] - 1 + 1; d[range] += (long long)mini * range; while(j < li[i].size() && li[i][j] < R[k]) j++; } } for(int i=len-1; i; i--) d[i] += d[i+1]; d[1] = (long long)len * (len + 1); d[1] >>= 1; int q; scanf("%d", &q); while(q--) { int x; scanf("%d", &x); printf("%lld\n", x>len?0:d[x]); } } return 0; }