#include using namespace std; // my choco pie #define ft first #define sd second #define pb push_back #define mp make_pair #define PII pair #define all(x) x.begin(),x.end() #define VI vector #define VII vector > #define VL vector #define VLL vector > #define PLL pair #define itr iterator #define fill(x,v) fill(all(x),v) // my fastest car series #define sc1(x) scanf("%d",&x) #define sc2(x,y) scanf("%d%d",&x,&y) #define sc3(x,y,z) scanf("%d%d%d",&x,&y,&z) #define sc4(a,b,c,d) scanf("%d%d%d%d",&a,&b,&c,&d) #define sc5(a,b,c,d,e) scanf("%d%d%d%d%d",&a,&b,&c,&d,&e) #define pr1(x) printf("%d\n",x) #define pr2(x,y) printf("%d %d\n",x,y) #define pr3(x,y,z) printf("%d %d %d\n",x,y,z) #define pr4(a,b,c,d) printf("%d %d %d %d\n",a,b,c,d) #define pr5(a,b,c,d,e) printf("%d %d %d %d %d\n",a,b,c,d,e) #define scll(x) scanf("%lld",&x) #define prll(x) printf("%lld\n",x) #define ms(x) memset(x,0,sizeof(x)) // data pies #define ll long long int #define li long int #define ff float #define db double // loopi loops #define rep(i,a,b) for(i=a;i=b;i--) // debugger #define print_v(x) for(int i=0;i= 0){ int head = iSA[s]; iSA[s] = head + cnt[head]++; b2h[iSA[s]] = true; } } for (int j = i; j < next_gen[i]; ++j){ int s = SA[j] - h; if (s >= 0 && b2h[iSA[s]]){ for (int k = iSA[s]+1; !bh[k] && b2h[k]; k++) b2h[k] = false; } } } for (int i=0; i 0) { int j = SA[iSA[i]-1]; while (i + h < n && j + h < n && txt[i+h] == txt[j+h]) h++; lcp[iSA[i]] = h; if (h > 0) h--; } } } int LCP[MAX][21]; inline void initialize_lcp() { for(int i = 0;i y) swap(x,y); int log = 0; while((1<= i ){ cnt ++ ; idx ++ ; } // cout << cnt << " " ; if( !cnt ){ idx ++ ;} if( cnt > mx ) mx = cnt ; for(int j=1;j<=cnt;j++){ ans[j] += nCr[cnt][j] ; if( ans[j] >= MOD ) ans[j] -= MOD ; } } // cout << endl ; } } void reset(){ memset(ans,0,sizeof ans) ; mx = 0 ; memset(bh,0,sizeof bh) ; memset(b2h,0,sizeof b2h) ; memset(cnt,0,sizeof cnt) ; memset(iSA,0,sizeof iSA) ; memset(SA,0,sizeof SA) ; memset(next_gen,0,sizeof next_gen) ; } int main() { int t ; sc1( t ) ; for(int i=0;i<=5000;i++) nCr[i][0] = 1 ; for(int i=1;i<=5000;i++){ for(int j=1;j<=i;j++){ nCr[i][j] = nCr[i-1][j] + nCr[i-1][j-1] ; if( nCr[i][j] >= MOD ) nCr[i][j] -= MOD ; } } while( t-- ){ int q ; sc2(len,q) ; scanf("%s",txt); suffixSort(len); getlcp(len); initialize_lcp(); process(); int k ; while( q -- ){ sc1(k) ; if( k > mx ){ cout << 0 << endl ; }else{ cout << ans[k] << endl ; } } reset() ; } return 0; }