#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;
int next[ 52 + 1 ] ;
node( )
{
endmark= 0 ;
for ( int i= 0 ; i< 53 ; i++ ) next[ i] = - 1 ;
}
} * root,nodes[ 110000 ] ;
int allocated_nodes;
node* alloc( ) {
if ( allocated_nodes == sizeof ( nodes) / sizeof ( nodes[ 0 ] ) )
exit ( 123 ) ;
node * n = nodes + allocated_nodes++ ;
* n = node( ) ;
return n;
}
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' + 26 ;
if ( curr- > next[ id] == - 1 )
curr- > next[ id] = alloc( ) - nodes;
curr= nodes+ 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' + 26 ;
if ( curr- > next[ id] == - 1 ) return 0 ;
curr= nodes+ curr- > next[ id] ;
}
return curr- > endmark;
}
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-- )
{
allocated_nodes = 0 ;
root= alloc( ) ;
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) ;
}
}
return 0 ;
}
I2luY2x1ZGU8c3RkaW8uaD4KI2luY2x1ZGU8c3RyaW5nLmg+CiNpbmNsdWRlPG1hdGguaD4KI2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPHN0cmluZz4KI2luY2x1ZGU8c3RkbGliLmg+CiNpbmNsdWRlPHZlY3Rvcj4KI2luY2x1ZGU8c3RhY2s+CiNpbmNsdWRlPHF1ZXVlPgojaW5jbHVkZTxzZXQ+CiNpbmNsdWRlPG1hcD4KI2luY2x1ZGU8YWxnb3JpdGhtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwojZGVmaW5lIG1heHYoQSxCKSAoQT5CP0E6QikKI2RlZmluZSBtaW52KEEsQikgKEE+Qj9COkEpCiNkZWZpbmUgaW5mIDIxNDc0ODM2NDcKI2RlZmluZSBwaSAoMiphY29zKDAuMCkpCiNkZWZpbmUgZXBzIDFlLTkKaW50IGdjZChpbnQgYSxpbnQgYikge3JldHVybiAoYj09MD9hOmdjZChiLGElYikpO30KaW50IGxjbShpbnQgYSxpbnQgYikge3JldHVybiAoYSooYi9nY2QoYSxiKSkpO30KaW50IGZ4W109ezAsMCwxLC0xfTsKaW50IGZ5W109ey0xLDEsMCwwfTsKY2hhciBlOwpzdHJ1Y3Qgbm9kZQp7CglpbnQgZW5kbWFyazsKCWludCBuZXh0WzUyKzFdOwoJbm9kZSgpCgl7CgkJZW5kbWFyaz0wOwoJCWZvcihpbnQgaT0wO2k8NTM7aSsrKSBuZXh0W2ldPS0xOwoJfQp9KnJvb3Qsbm9kZXNbMTEwMDAwXTsKaW50IGFsbG9jYXRlZF9ub2RlczsKbm9kZSogYWxsb2MoKXsKCWlmKGFsbG9jYXRlZF9ub2RlcyA9PSBzaXplb2Yobm9kZXMpL3NpemVvZihub2Rlc1swXSkpCgkJZXhpdCgxMjMpOwoJbm9kZSAqbiA9IG5vZGVzICsgYWxsb2NhdGVkX25vZGVzKys7CgkqbiA9IG5vZGUoKTsKCXJldHVybiBuOwp9CnZvaWQgaW5zZXJ0KHN0cmluZyBzdHIsaW50IGxlbikKewoJbm9kZSAqY3Vycj1yb290OwoJaW50IGlkOwoJZm9yKGludCBpPTA7aTxsZW47aSsrKQoJewoJCWlmKHN0cltpXT49J2EnJiZzdHJbaV08PSd6JykKCQkgICAgaWQ9c3RyW2ldLSdhJzsKCQllbHNlIGlmKHN0cltpXT49J0EnJiZzdHJbaV08PSdaJykKCQkgICAgaWQ9c3RyW2ldLSdBJysyNjsKCQlpZihjdXJyLT5uZXh0W2lkXT09LTEpIAoJCQljdXJyLT5uZXh0W2lkXT1hbGxvYygpLW5vZGVzOwoJCWN1cnI9bm9kZXMrY3Vyci0+bmV4dFtpZF07Cgl9CgljdXJyLT5lbmRtYXJrPWN1cnItPmVuZG1hcmsrMTsKCQp9CmludCBzZWFyY2goc3RyaW5nIHN0cixpbnQgbGVuKQp7Cglub2RlICpjdXJyPXJvb3Q7CglpbnQgaWQ7Cglmb3IoaW50IGk9MDtpPGxlbjtpKyspCgl7CgkJaWYoc3RyW2ldPj0nYScmJnN0cltpXTw9J3onKQoJCSAgICBpZD1zdHJbaV0tJ2EnOwoJCWVsc2UgaWYoc3RyW2ldPj0nQScmJnN0cltpXTw9J1onKQoJCSAgICBpZD1zdHJbaV0tJ0EnKzI2OwoJCWlmKGN1cnItPm5leHRbaWRdPT0tMSkgcmV0dXJuIDA7CgkJY3Vycj1ub2RlcytjdXJyLT5uZXh0W2lkXTsKCX0KCXJldHVybiBjdXJyLT5lbmRtYXJrOwp9CmludCBtYWluKCkKewoJLy9mcmVvcGVuKCJpbnB1dC50eHQiLCJyIixzdGRpbik7CgkvL2ZyZW9wZW4oIm91dHB1dC50eHQiLCJ3IixzdGRvdXQpOwppbnQgbnVtX3dvcmQsaSx0LGNhPTEsbDsKc3RyaW5nIHN0cixzMjsKY2luPj50Owp3aGlsZSh0LS0pCnsKCWFsbG9jYXRlZF9ub2RlcyA9IDA7CnJvb3Q9YWxsb2MoKTsKY2luPj5udW1fd29yZDsKZm9yKGk9MDtpPG51bV93b3JkO2krKykKewoJY2luPj5zdHI7CglsPXN0ci5zaXplKCk7CglpZihsPjMpCgkJc29ydChzdHIuYmVnaW4oKSsxLHN0ci5lbmQoKS0xKTsKCWluc2VydChzdHIsbCk7CglzdHI9IiI7Cn0KCWludCBxdWVyeSxhbnM9MSxsbCxqajsKCWNoYXIgczFbMTAwMDA1XTsKCWNpbj4+cXVlcnk7CglwcmludGYoIkNhc2UgJWQ6XG4iLGNhKyspOwoJZ2V0Y2hhcigpOwoJZm9yKGpqPTE7amo8PXF1ZXJ5O2pqKyspCgl7CgkJYW5zPTE7CgkJZ2V0cyhzMSk7CgkJc3RyPXMxOwoJCWxsPXN0ci5zaXplKCk7CgkJaT0wOwoJCXdoaWxlKGk8bGwpCgkJewoJCQlzMj0iIjsKCQkJd2hpbGUoaTxsbCYmc3RyW2ldIT0nICcpCgkJCXsKCQkJCXMyPXMyK3N0cltpKytdOwoJCQl9CgkJCXdoaWxlKHN0cltpXT09JyAnJiZpPGxsKSAKCQkJCWkrKzsKCgkJCWw9czIuc2l6ZSgpOwoJCQlpZihsPT0wKSB7YW5zKj0xOyBjb250aW51ZTt9CglpZihsPjMpCgkJc29ydChzMi5iZWdpbigpKzEsczIuZW5kKCktMSk7CglhbnMqPXNlYXJjaChzMixzMi5zaXplKCkpOwoJCX0KCXByaW50ZigiJWRcbiIsYW5zKTsKCX0KfQoJcmV0dXJuIDA7Cn0=