#pragma GCC optimize ("Ofast")
#include<bits/stdc++.h>
using namespace std;
#define main dummy_main
int main( ) {
return 0 ;
}
#undef main
class Solution{
public :
vector< int > findNumOfValidWords( vector< string> & words, vector< string> & puzzles) {
int ans, c, i, j, k, q;
map< int ,int > mp;
vector< int > res;
mp.clear ( ) ;
for ( k= 0 ; k< ( words.size ( ) ) ; k++ ) {
j = 0 ;
for ( i= 0 ; i< ( words[ k] .size ( ) ) ; i++ ) {
c = words[ k] [ i] - 'a' ;
j | = ( 1 << c) ;
}
mp[ j] ++ ;
}
for ( q= 0 ; q< ( puzzles.size ( ) ) ; q++ ) {
string s= puzzles[ q] ;
ans = 0 ;
for ( i= 0 ; i< ( 7 ) ; i++ ) {
s[ i] - = 'a' ;
}
for ( i= 0 ; i< ( 1 << 6 ) ; i++ ) {
k = ( 1 << s[ 0 ] ) ;
for ( j= 0 ; j< ( 6 ) ; j++ ) {
if ( i& 1 << j) {
k | = ( 1 << s[ j+ 1 ] ) ;
}
}
ans + = mp[ k] ;
}
res.push_back ( ans) ;
}
return res;
}
}
;
// cLay varsion 20190830-1
// --- original code ---
// #define main dummy_main
// {}
// #undef main
//
// class Solution {
// public:
// vector<int> findNumOfValidWords(vector<string>& words, vector<string>& puzzles) {
// int i, j, k, c, q, ans;
// map<int,int> mp;
// vector<int> res;
//
// mp.clear();
// rep(k,words.size()){
// j = 0;
// rep(i,words[k].size()){
// c = words[k][i] - 'a';
// j |= (1<<c);
// }
// mp[j]++;
// }
//
// rep(q,puzzles.size()){
// string s = puzzles[q];
// ans = 0;
//
// rep(i,7) s[i] -= 'a';
//
// rep(i,1<<6){
// k = (1<<s[0]);
// rep(j,6) if(i&1<<j) k |= (1<<s[j+1]);
// ans += mp[k];
// }
//
// res.push_back(ans);
// }
//
// return res;
// }
// };
I3ByYWdtYSBHQ0Mgb3B0aW1pemUgKCJPZmFzdCIpCiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgbWFpbiBkdW1teV9tYWluCmludCBtYWluKCl7CiAgcmV0dXJuIDA7Cn0KI3VuZGVmIG1haW4KY2xhc3MgU29sdXRpb257CiAgcHVibGljOgogIHZlY3RvcjxpbnQ+IGZpbmROdW1PZlZhbGlkV29yZHModmVjdG9yPHN0cmluZz4mIHdvcmRzLCB2ZWN0b3I8c3RyaW5nPiYgcHV6emxlcyl7CiAgICBpbnQgYW5zLCBjLCBpLCBqLCBrLCBxOwogICAgbWFwPGludCxpbnQ+IG1wOwogICAgdmVjdG9yPGludD4gcmVzOwogICAgbXAuY2xlYXIoKTsKICAgIGZvcihrPTA7azwod29yZHMuc2l6ZSgpKTtrKyspewogICAgICBqID0gMDsKICAgICAgZm9yKGk9MDtpPCh3b3Jkc1trXS5zaXplKCkpO2krKyl7CiAgICAgICAgYyA9IHdvcmRzW2tdW2ldIC0gJ2EnOwogICAgICAgIGogfD0gKDE8PGMpOwogICAgICB9CiAgICAgIG1wW2pdKys7CiAgICB9CiAgICBmb3IocT0wO3E8KHB1enpsZXMuc2l6ZSgpKTtxKyspewogICAgICBzdHJpbmcgcz1wdXp6bGVzW3FdOwogICAgICBhbnMgPSAwOwogICAgICBmb3IoaT0wO2k8KDcpO2krKyl7CiAgICAgICAgc1tpXSAtPSAnYSc7CiAgICAgIH0KICAgICAgZm9yKGk9MDtpPCgxPDw2KTtpKyspewogICAgICAgIGsgPSAoMTw8c1swXSk7CiAgICAgICAgZm9yKGo9MDtqPCg2KTtqKyspewogICAgICAgICAgaWYoaSYxPDxqKXsKICAgICAgICAgICAgayB8PSAoMTw8c1tqKzFdKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYW5zICs9IG1wW2tdOwogICAgICB9CiAgICAgIHJlcy5wdXNoX2JhY2soYW5zKTsKICAgIH0KICAgIHJldHVybiByZXM7CiAgfQp9CjsKLy8gY0xheSB2YXJzaW9uIDIwMTkwODMwLTEKCi8vIC0tLSBvcmlnaW5hbCBjb2RlIC0tLQovLyAjZGVmaW5lIG1haW4gZHVtbXlfbWFpbgovLyB7fQovLyAjdW5kZWYgbWFpbgovLyAKLy8gY2xhc3MgU29sdXRpb24gewovLyBwdWJsaWM6Ci8vICAgdmVjdG9yPGludD4gZmluZE51bU9mVmFsaWRXb3Jkcyh2ZWN0b3I8c3RyaW5nPiYgd29yZHMsIHZlY3RvcjxzdHJpbmc+JiBwdXp6bGVzKSB7Ci8vICAgICBpbnQgaSwgaiwgaywgYywgcSwgYW5zOwovLyAgICAgbWFwPGludCxpbnQ+IG1wOwovLyAgICAgdmVjdG9yPGludD4gcmVzOwovLyAKLy8gICAgIG1wLmNsZWFyKCk7Ci8vICAgICByZXAoayx3b3Jkcy5zaXplKCkpewovLyAgICAgICBqID0gMDsKLy8gICAgICAgcmVwKGksd29yZHNba10uc2l6ZSgpKXsKLy8gICAgICAgICBjID0gd29yZHNba11baV0gLSAnYSc7Ci8vICAgICAgICAgaiB8PSAoMTw8Yyk7Ci8vICAgICAgIH0KLy8gICAgICAgbXBbal0rKzsKLy8gICAgIH0KLy8gCi8vICAgICByZXAocSxwdXp6bGVzLnNpemUoKSl7Ci8vICAgICAgIHN0cmluZyBzID0gcHV6emxlc1txXTsKLy8gICAgICAgYW5zID0gMDsKLy8gICAgICAgCi8vICAgICAgIHJlcChpLDcpIHNbaV0gLT0gJ2EnOwovLyAgICAgICAKLy8gICAgICAgcmVwKGksMTw8Nil7Ci8vICAgICAgICAgayA9ICgxPDxzWzBdKTsKLy8gICAgICAgICByZXAoaiw2KSBpZihpJjE8PGopIGsgfD0gKDE8PHNbaisxXSk7Ci8vICAgICAgICAgYW5zICs9IG1wW2tdOwovLyAgICAgICB9Ci8vIAovLyAgICAgICByZXMucHVzaF9iYWNrKGFucyk7Ci8vICAgICB9Ci8vIAovLyAgICAgcmV0dXJuIHJlczsKLy8gICB9Ci8vIH07Cg==