#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<string>
#include<stdlib.h>
#include<vector>
#include<stack>
#include<queue>
#include<set>
#include<map>
#include<algorithm>
using namespace std;
#define maxv(A,B) (A>B?A:B)
#define minv(A,B) (A>B?B:A)
#define inf 2147483647
#define pi (2*acos(0.0))
#define eps 1e-9
int gcd( int a,int b) { return ( b== 0 ? a: gcd( b,a% b) ) ; }
int lcm( int a,int b) { return ( a* ( b/ gcd( a,b) ) ) ; }
int fx[ ] = { 0 ,0 ,1 ,- 1 } ;
int fy[ ] = { - 1 ,1 ,0 ,0 } ;
char e;
struct node
{
int endmark;
node * next[ 50 + 1 ] ;
node( )
{
endmark= 0 ;
for ( int i= 0 ; i< 51 ; i++ ) next[ i] = NULL ;
}
} * root;
void insert( string str,int len)
{
node * curr= root;
int id;
for ( int i= 0 ; i< len; i++ )
{
if ( str[ i] >= 'a' && str[ i] <= 'z' )
id= str[ i] - 'a' ;
else if ( str[ i] >= 'A' && str[ i] <= 'Z' )
id= str[ i] - 'A' + 25 ;
if ( curr- > next[ id] == NULL )
curr- > next[ id] = new node( ) ;
curr= curr- > next[ id] ;
}
curr- > endmark= curr- > endmark+ 1 ;
}
int search( string str,int len)
{
node * curr= root;
int id;
for ( int i= 0 ; i< len; i++ )
{
if ( str[ i] >= 'a' && str[ i] <= 'z' )
id= str[ i] - 'a' ;
else if ( str[ i] >= 'A' && str[ i] <= 'Z' )
id= str[ i] - 'A' + 25 ;
if ( curr- > next[ id] == NULL ) return 0 ;
curr= curr- > next[ id] ;
}
return curr- > endmark;
}
void del( node * cur)
{
for ( int i= 0 ; i< 51 ; i++ )
if ( cur- > next[ i] )
del( cur- > next[ i] ) ;
delete ( cur) ;
}
int main( )
{
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
int num_word,i,t,ca= 1 ,l;
string str,s2;
cin >> t;
while ( t-- )
{
root= new node( ) ;
cin >> num_word;
for ( i= 0 ; i< num_word; i++ )
{
cin >> str;
l= str.size ( ) ;
if ( l> 3 )
sort( str.begin ( ) + 1 ,str.end ( ) - 1 ) ;
insert( str,l) ;
str= "" ;
}
int query,ans= 1 ,ll,jj;
char s1[ 100005 ] ;
cin >> query;
printf ( "Case %d:\n " ,ca++ ) ;
getchar ( ) ;
for ( jj= 1 ; jj<= query; jj++ )
{
ans= 1 ;
gets ( s1) ;
str= s1;
ll= str.size ( ) ;
i= 0 ;
while ( i< ll)
{
s2= "" ;
while ( i< ll&& str[ i] ! = ' ' )
{
s2= s2+ str[ i++ ] ;
}
while ( str[ i] == ' ' && i< ll)
i++ ;
l= s2.size ( ) ;
if ( l== 0 ) { ans* = 1 ; continue ; }
if ( l> 3 )
sort( s2.begin ( ) + 1 ,s2.end ( ) - 1 ) ;
ans* = search( s2,s2.size ( ) ) ;
}
printf ( "%d\n " ,ans) ;
}
del( root) ;
}
return 0 ;
}
I2luY2x1ZGU8c3RkaW8uaD4KI2luY2x1ZGU8c3RyaW5nLmg+CiNpbmNsdWRlPG1hdGguaD4KI2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPHN0cmluZz4KI2luY2x1ZGU8c3RkbGliLmg+CiNpbmNsdWRlPHZlY3Rvcj4KI2luY2x1ZGU8c3RhY2s+CiNpbmNsdWRlPHF1ZXVlPgojaW5jbHVkZTxzZXQ+CiNpbmNsdWRlPG1hcD4KI2luY2x1ZGU8YWxnb3JpdGhtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwojZGVmaW5lIG1heHYoQSxCKSAoQT5CP0E6QikKI2RlZmluZSBtaW52KEEsQikgKEE+Qj9COkEpCiNkZWZpbmUgaW5mIDIxNDc0ODM2NDcKI2RlZmluZSBwaSAoMiphY29zKDAuMCkpCiNkZWZpbmUgZXBzIDFlLTkKaW50IGdjZChpbnQgYSxpbnQgYikge3JldHVybiAoYj09MD9hOmdjZChiLGElYikpO30KaW50IGxjbShpbnQgYSxpbnQgYikge3JldHVybiAoYSooYi9nY2QoYSxiKSkpO30KaW50IGZ4W109ezAsMCwxLC0xfTsKaW50IGZ5W109ey0xLDEsMCwwfTsKY2hhciBlOwpzdHJ1Y3Qgbm9kZQp7CglpbnQgZW5kbWFyazsKCW5vZGUgKm5leHRbNTArMV07Cglub2RlKCkKCXsKCQllbmRtYXJrPTA7CgkJZm9yKGludCBpPTA7aTw1MTtpKyspIG5leHRbaV09TlVMTDsKCX0KfSpyb290Owp2b2lkIGluc2VydChzdHJpbmcgc3RyLGludCBsZW4pCnsKCW5vZGUgKmN1cnI9cm9vdDsKCWludCBpZDsKCWZvcihpbnQgaT0wO2k8bGVuO2krKykKCXsKCQlpZihzdHJbaV0+PSdhJyYmc3RyW2ldPD0neicpCgkJICAgIGlkPXN0cltpXS0nYSc7CgkJZWxzZSBpZihzdHJbaV0+PSdBJyYmc3RyW2ldPD0nWicpCgkJICAgIGlkPXN0cltpXS0nQScrMjU7CgkJaWYoY3Vyci0+bmV4dFtpZF09PU5VTEwpIAoJCQljdXJyLT5uZXh0W2lkXT1uZXcgbm9kZSgpOwoJCWN1cnI9Y3Vyci0+bmV4dFtpZF07Cgl9CgljdXJyLT5lbmRtYXJrPWN1cnItPmVuZG1hcmsrMTsKCQp9CmludCBzZWFyY2goc3RyaW5nIHN0cixpbnQgbGVuKQp7Cglub2RlICpjdXJyPXJvb3Q7CglpbnQgaWQ7Cglmb3IoaW50IGk9MDtpPGxlbjtpKyspCgl7CgkJaWYoc3RyW2ldPj0nYScmJnN0cltpXTw9J3onKQoJCSAgICBpZD1zdHJbaV0tJ2EnOwoJCWVsc2UgaWYoc3RyW2ldPj0nQScmJnN0cltpXTw9J1onKQoJCSAgICBpZD1zdHJbaV0tJ0EnKzI1OwoJCWlmKGN1cnItPm5leHRbaWRdPT1OVUxMKSByZXR1cm4gMDsKCQljdXJyPWN1cnItPm5leHRbaWRdOwoJfQoJcmV0dXJuIGN1cnItPmVuZG1hcms7Cn0Kdm9pZCBkZWwobm9kZSAqY3VyKQp7ICAgICAgICAKICAgICAgZm9yKGludCBpPTA7aTw1MTtpKyspCiAgICAgICAgICAgICBpZihjdXItPm5leHRbaV0pCiAgICAgICAgICAgICAgICAgIGRlbChjdXItPm5leHRbaV0pIDsgICAgIAogICAgICBkZWxldGUoY3VyKSA7Cn0KaW50IG1haW4oKQp7CgkvL2ZyZW9wZW4oImlucHV0LnR4dCIsInIiLHN0ZGluKTsKCS8vZnJlb3Blbigib3V0cHV0LnR4dCIsInciLHN0ZG91dCk7CmludCBudW1fd29yZCxpLHQsY2E9MSxsOwpzdHJpbmcgc3RyLHMyOwpjaW4+PnQ7CndoaWxlKHQtLSkKewpyb290PW5ldyBub2RlKCk7CmNpbj4+bnVtX3dvcmQ7CmZvcihpPTA7aTxudW1fd29yZDtpKyspCnsKCWNpbj4+c3RyOwoJbD1zdHIuc2l6ZSgpOwoJaWYobD4zKQoJCXNvcnQoc3RyLmJlZ2luKCkrMSxzdHIuZW5kKCktMSk7CglpbnNlcnQoc3RyLGwpOwoJc3RyPSIiOwp9CglpbnQgcXVlcnksYW5zPTEsbGwsamo7CgljaGFyIHMxWzEwMDAwNV07CgljaW4+PnF1ZXJ5OwoJcHJpbnRmKCJDYXNlICVkOlxuIixjYSsrKTsKCWdldGNoYXIoKTsKCWZvcihqaj0xO2pqPD1xdWVyeTtqaisrKQoJewoJCWFucz0xOwoJCWdldHMoczEpOwoJCXN0cj1zMTsKCQlsbD1zdHIuc2l6ZSgpOwoJCWk9MDsKCQl3aGlsZShpPGxsKQoJCXsKCQkJczI9IiI7CgkJCXdoaWxlKGk8bGwmJnN0cltpXSE9JyAnKQoJCQl7CgkJCQlzMj1zMitzdHJbaSsrXTsKCQkJfQoJCQl3aGlsZShzdHJbaV09PScgJyYmaTxsbCkgCgkJCQlpKys7CgoJCQlsPXMyLnNpemUoKTsKCQkJaWYobD09MCkge2Fucyo9MTsgY29udGludWU7fQoJaWYobD4zKQoJCXNvcnQoczIuYmVnaW4oKSsxLHMyLmVuZCgpLTEpOwoJYW5zKj1zZWFyY2goczIsczIuc2l6ZSgpKTsKCQl9CglwcmludGYoIiVkXG4iLGFucyk7Cgl9CglkZWwocm9vdCk7Cn0KCXJldHVybiAwOwp9