#!/usr/bin/python3 springs = [] try: while True: s = input() springs.append((s.split(" ")[0], list(map(int, s.split(" ")[1].split(","))))) except EOFError: pass def counts(vhod): s = vhod + "$" prev = None r = [] run = 0 for c in s: if prev == None: prev = c run = 1 continue if c == prev: run += 1 continue if prev == "#": r.append(run) prev = c run = 1 return r """ for spring in springs: print(counts(spring[0]), spring[1]) """ def possibilities(x): r = 0 countq = x[0].count("?") for bits in range(2**countq): copy = x[0] for i in range(countq): if bits & (1 << i): copy = copy.replace("?", ".", 1) else: copy = copy.replace("?", "#", 1) if counts(copy) == x[1]: r += 1 return r def possibilities_serial(array): s = 0 for element in array: s += possibilities(element) return s batch_size = 10 batches = [springs[x:x+batch_size] for x in range(0, len(springs), batch_size)] from multiprocessing import Pool with Pool(len(batches)) as p: print(sum(p.map(possibilities_serial, batches)))