import sys
from itertools import combinations
import pprint
subsequences = {}
def calculate_subsequences(word):
indexes = [i for i in range(len(word))]
for length in range(1, len(indexes)+1):
for seq in combinations(indexes, length):
substr = ''.join(word[i] for i in seq)
if substr not in subsequences:
subsequences[substr] = set([seq])
else:
subsequences[substr].add(seq)
def count_subsequences():
count = 0
for sub in subsequences.values():
count += len(sub) > 1
return count
def swap_letter(word, position, letter):
affected = []
for substr, seqs in subsequences.items():
affected.extend(seq for seq in seqs if position in seq)
subsequences[substr] = set(seq for seq in seqs if position not in seq)
for sequence in affected:
substr = ''.join(word[i] for i in sequence)
if substr not in subsequences:
subsequences[substr] = set([sequence])
else:
subsequences[substr].add(sequence)
if __name__ == "__main__":
data = tuple(x for x in sys.stdin.read().split())
length = int(data[0])
operations = int(data[1])
word = data[2]
calculate_subsequences(word)
print(count_subsequences())
for q in range(operations):
position = int(data[3+q*2])-1
letter = data[3+q*2+1]
if letter == word[position]:
print(count_subsequences())
continue
word = word[:position] + letter + word[position+1:]
swap_letter(word, position, letter)
print(count_subsequences())
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | import sys from itertools import combinations import pprint subsequences = {} def calculate_subsequences(word): indexes = [i for i in range(len(word))] for length in range(1, len(indexes)+1): for seq in combinations(indexes, length): substr = ''.join(word[i] for i in seq) if substr not in subsequences: subsequences[substr] = set([seq]) else: subsequences[substr].add(seq) def count_subsequences(): count = 0 for sub in subsequences.values(): count += len(sub) > 1 return count def swap_letter(word, position, letter): affected = [] for substr, seqs in subsequences.items(): affected.extend(seq for seq in seqs if position in seq) subsequences[substr] = set(seq for seq in seqs if position not in seq) for sequence in affected: substr = ''.join(word[i] for i in sequence) if substr not in subsequences: subsequences[substr] = set([sequence]) else: subsequences[substr].add(sequence) if __name__ == "__main__": data = tuple(x for x in sys.stdin.read().split()) length = int(data[0]) operations = int(data[1]) word = data[2] calculate_subsequences(word) print(count_subsequences()) for q in range(operations): position = int(data[3+q*2])-1 letter = data[3+q*2+1] if letter == word[position]: print(count_subsequences()) continue word = word[:position] + letter + word[position+1:] swap_letter(word, position, letter) print(count_subsequences()) |
English