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