48 lines
1.1 KiB
Python
48 lines
1.1 KiB
Python
import enum
|
|
|
|
|
|
def count_inversions(seq: str)-> int:
|
|
inversions = 0
|
|
count = 0
|
|
for i, c in enumerate(seq):
|
|
if c == '0':
|
|
inversions += i - count
|
|
count += 1
|
|
return inversions
|
|
|
|
class sequence_generator:
|
|
def __init__(self, seq: str):
|
|
self._seq = seq
|
|
self.qpos = []
|
|
for i, c in enumerate(seq):
|
|
if c == '?':
|
|
self.qpos.append(i)
|
|
|
|
def __iter__(self):
|
|
self.max = pow(2, len(self.qpos))
|
|
self.current = 0
|
|
return self
|
|
|
|
def __next__(self):
|
|
if self.current < self.max:
|
|
new_seq = self._seq
|
|
bstr = "{0:b}".format(self.current)
|
|
bstr = "".join(("0" * (len("{0:b}".format(self.max)) - len(bstr) - 1), bstr))
|
|
for i, c in enumerate(bstr):
|
|
new_seq = f"{new_seq[:self.qpos[i]]}{c}{new_seq[self.qpos[i]+1:]}"
|
|
self.current += 1
|
|
return new_seq
|
|
raise StopIteration
|
|
|
|
|
|
seq = input()
|
|
if "?" not in seq:
|
|
sum = count_inversions(seq)
|
|
else:
|
|
s = sequence_generator(seq)
|
|
sum = 0
|
|
for x in s:
|
|
sum += count_inversions(x)
|
|
|
|
print(sum % 1000000007)
|