#include <set>
#include <bitset>
#include <list>
#include <map>
#include <stack>
#include <queue>
#include <deque>
#include <string>
#include <vector>
#include <ios>
#include <iostream>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <algorithm>
#include <utility>
#include <complex>
#include <numeric>
#include <functional>
#include <cmath>
#include <ctime>
#include <climits>
#include <cstdarg>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cassert>
#define lson rt << 1, l, m
#define rson rt << 1 | 1, m + 1, r
using namespace std;
const int INF = 0x7FFFFFFF;
const double EPS = 1e-10;
const double PI = 2 * acos (0.0);
const int MOD = 1e9 + 7;
const int maxn = 26;
const int nodemaxn = 250000 + 66;
char ss[1000000+maxn];
int cnt[500+maxn];
char val[500+maxn][500+maxn];
struct ACNode
{
int next[nodemaxn][maxn], pre[nodemaxn], last[nodemaxn], id[nodemaxn];
int root, len;
void Init ()
{
len = 0;
root = newnode ();
}
int newnode ()
{
for (int i = 0; i < maxn; i++)
next[len][i] = -1;
last[len] = id[len] = 0;
len++;
return len - 1;
}
void Insert (char *s, int ff)
{
int p = root;
for(int i = 0; s[i]; i++)
{
if(next[p][s[i]-'a'] == -1)
next[p][s[i]-'a'] = newnode ();
p = next[p][s[i]-'a'];
}
last[p]++;
id[p] = ff;
}
void Build ()
{
queue <int> qu;
pre[root] = root;
for(int i = 0; i < maxn; i++)
{
if(next[root][i] == -1)
next[root][i] = root;
else
{
pre[next[root][i]] = root;
qu.push (next[root][i]);
}
}
while (!qu.empty ())
{
int p = qu.front(); qu.pop ();
for (int i = 0; i < maxn; i++)
{
if (next[p][i] == -1)
next[p][i] = next[pre[p]][i];
else
{
pre[next[p][i]] = next[pre[p]][i];
qu.push (next[p][i]);
}
}
}
}
void Query (char *s)
{
int p = root;
for (int i = 0; s[i]; i++)
{
p = next[p][s[i]-'a'];//一步到位,重要!!! 当存在时走到下一层,否则回溯!!!
int temp = p;
while (temp != root)
{
if (last[temp])
{
cnt[id[temp]]++;
}
temp = pre[temp];
}
}
}
};
ACNode ac;
int main()
{
// freopen ("aaa.txt", "r", stdin);
int n, t, flag = 1;
scanf ("%d", &t);
while (t--)
{
printf ("Case %d:\n", flag++);
scanf ("%d", &n);
scanf ("%s", ss);
ac.Init ();
memset (cnt, 0, sizeof (cnt));
for (int i = 1; i <= n; i++)
{
scanf ("%s", val[i]);
int j;
for (j = 1; j < i; j++)
if (!strcmp (val[j], val[i]))
break;
if (j >= i)
ac.Insert (val[i], i);
}
ac.Build ();
ac.Query (ss);
for (int i = 1; i <= n; i++)
{
int j;
for (j = 1; j < i; j++)
if (!strcmp (val[j], val[i]))
break;
if (j < i)
printf ("%d\n", cnt[j]);
else
printf ("%d\n", cnt[i]);
}
}
return 0;
}