With respect to a given puzzle string, a word is valid if both the following conditions are satisfied:
word contains the first letter of puzzle.
For each letter in word, that letter is in puzzle.
        For example, if the puzzle is "abcdefg", then valid words are "faced", "cabbage", and "baggage"; while invalid words are "beefed" (doesn't include "a") and "based" (includes "s" which isn't in the puzzle).
Return an array answer, where answer[i] is the number of words in the given word list words that are valid with respect to the puzzle puzzles[i].
Example :
Input: 
words = ["aaaa","asas","able","ability","actt","actor","access"], 
puzzles = ["aboveyz","abrodyz","abslute","absoryz","actresz","gaswxyz"]
Output: [1,1,3,2,4,0]
Explanation:
1 valid word for "aboveyz" : "aaaa" 
1 valid word for "abrodyz" : "aaaa"
3 valid words for "abslute" : "aaaa", "asas", "able"
2 valid words for "absoryz" : "aaaa", "asas"
4 valid words for "actresz" : "aaaa", "asas", "actt", "access"
There're no valid words for "gaswxyz" cause none of the words in the list contains letter 'g'.
Constraints:
1 <= words.length <= 10^5
4 <= words[i].length <= 50
1 <= puzzles.length <= 10^4
puzzles[i].length == 7
words[i][j], puzzles[i][j] are English lowercase letters.
Each puzzles[i] doesn't contain repeated characters.
class Solution:
    def findNumOfValidWords(self, words: List[str], puzzles: List[str]) -> List[int]:
        
        counter = {}
        for word in words:
            mask = self.to_int(word)
            if mask not in counter:
                counter[mask] = 0
            counter[mask] += 1
                
        output = []
        for puzzle in puzzles:
            output.append(0)
            sub_strings = ['']
            mask = self.to_int(puzzle[1:])
            for c in puzzle[1:]:
                for sub_string in list(sub_strings):
                    sub_strings.append(sub_string+c)
            for sub_string in list(sub_strings):
                mask = self.to_int(puzzle[0] + sub_string)
                output[-1] += counter.get(mask, 0)
            
        return output
    
    def to_int(self, word):
        mask = 0
        for ch in word:
            mask |= 1 << (ord(ch) - 97)
        return mask

class Solution:
    def findNumOfValidWords(self, words: List[str], puzzles: List[str]) -> List[int]:
        
        counter = {}
        for word in words:
            mask = self.to_int(word)
            if mask not in counter:
                counter[mask] = 0
            counter[mask] += 1
                
        output = []
        for puzzle in puzzles:
            output.append(0)
            sub_strings = ['']
            mask = self.to_int(puzzle[1:])
            for c in puzzle[1:]:
                for sub_string in list(sub_strings):
                    sub_strings.append(sub_string+c)
            for sub_string in list(sub_strings):
                mask = self.to_int(puzzle[0] + sub_string)
                output[-1] += counter.get(mask, 0)
            
        return output
    
    def to_int(self, word):
        mask = 0
        for ch in word:
            mask |= 1 << (ord(ch) - 97)
        return mask
