EPS/2024/02/05-02-24/d.py

54 lines
1.2 KiB
Python
Raw Normal View History

2024-04-15 13:45:30 +02:00
from functools import cache
import bisect
import sys
base_limit = sys.getrecursionlimit()
def sc(cons):
return (cons*(cons+1))/2
def brutetop(a, b, k):
first = {}
for i in range(len(a)):
if a[i] not in first and a[i] != b[i]:
first[a[i]] = i
@cache
def brute(Q, i, cons):
if i == len(a):
return sc(cons)
if a[i] == b[i] or a[i] in Q:
return brute(Q, i+1, cons+1)
if len(Q) < k and (a[i] in first and i == first[a[i]]):
Qcop = list(Q)
bisect.insort(Qcop, a[i])
res1 = brute(Q, i+1, 0) + sc(cons)
res2 = brute(tuple(Qcop), i+1, cons+1)
return max(res1, res2)
return brute(Q, i+1, 0) + sc(cons)
return brute((), 0, 0)
def main():
ct = int(input())
ress = []
for _ in range(ct):
# len(a, b), char lim
n, k = [int(i) for i in input().split()]
a = input() # a = base string
b = input() # b = objective
sys.setrecursionlimit(max(len(a), base_limit))
print(int(brutetop(a, b, k)))
#ress.append(str(int(brutetop(a, b, k))))
#print("\n".join(ress))
main()