0-1 Sequences (failed time limit)
This commit is contained in:
47
sequences.py
Normal file
47
sequences.py
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
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)
|
||||||
Reference in New Issue
Block a user