def calculateMinimumSwaps(fileSize, affinity):
n = len(fileSize)
conflicts = [i for i in range(n) if fileSize[i] == affinity[i]]
if not conflicts:
return 0
non_conflicts = [i for i in range(n) if fileSize[i] != affinity[i]]
swaps = 0
fileSize = fileSize[:]
for i in conflicts[:]:
swapped = False
for j in non_conflicts:
fileSize[i], fileSize[j] = fileSize[j], fileSize[i]
if fileSize[i] != affinity[i] and fileSize[j] != affinity[j]:
swaps += 1
conflicts.remove(i)
non_conflicts.remove(j)
swapped = True
break
fileSize[i], fileSize[j] = fileSize[j], fileSize[i]
if not swapped:
continue
while len(conflicts) > 1:
i = conflicts.pop()
j = conflicts.pop()
fileSize[i], fileSize[j] = fileSize[j], fileSize[i]
if fileSize[i] != affinity[i] and fileSize[j] != affinity[j]:
swaps += 1
else:
return -1
if conflicts:
return -1
return swaps
print(calculateMinimumSwaps([1,2,1,2,1,2],[1,1,2,2,1,2]))
ZGVmIGNhbGN1bGF0ZU1pbmltdW1Td2FwcyhmaWxlU2l6ZSwgYWZmaW5pdHkpOgogICAgbiA9IGxlbihmaWxlU2l6ZSkKICAgIGNvbmZsaWN0cyA9IFtpIGZvciBpIGluIHJhbmdlKG4pIGlmIGZpbGVTaXplW2ldID09IGFmZmluaXR5W2ldXQogICAgaWYgbm90IGNvbmZsaWN0czoKICAgICAgICByZXR1cm4gMAoKICAgIG5vbl9jb25mbGljdHMgPSBbaSBmb3IgaSBpbiByYW5nZShuKSBpZiBmaWxlU2l6ZVtpXSAhPSBhZmZpbml0eVtpXV0KICAgIHN3YXBzID0gMAogICAgZmlsZVNpemUgPSBmaWxlU2l6ZVs6XQoKICAgIGZvciBpIGluIGNvbmZsaWN0c1s6XToKICAgICAgICBzd2FwcGVkID0gRmFsc2UKICAgICAgICBmb3IgaiBpbiBub25fY29uZmxpY3RzOgogICAgICAgICAgICBmaWxlU2l6ZVtpXSwgZmlsZVNpemVbal0gPSBmaWxlU2l6ZVtqXSwgZmlsZVNpemVbaV0KICAgICAgICAgICAgaWYgZmlsZVNpemVbaV0gIT0gYWZmaW5pdHlbaV0gYW5kIGZpbGVTaXplW2pdICE9IGFmZmluaXR5W2pdOgogICAgICAgICAgICAgICAgc3dhcHMgKz0gMQogICAgICAgICAgICAgICAgY29uZmxpY3RzLnJlbW92ZShpKQogICAgICAgICAgICAgICAgbm9uX2NvbmZsaWN0cy5yZW1vdmUoaikKICAgICAgICAgICAgICAgIHN3YXBwZWQgPSBUcnVlCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBmaWxlU2l6ZVtpXSwgZmlsZVNpemVbal0gPSBmaWxlU2l6ZVtqXSwgZmlsZVNpemVbaV0KICAgICAgICBpZiBub3Qgc3dhcHBlZDoKICAgICAgICAgICAgY29udGludWUKCiAgICB3aGlsZSBsZW4oY29uZmxpY3RzKSA+IDE6CiAgICAgICAgaSA9IGNvbmZsaWN0cy5wb3AoKQogICAgICAgIGogPSBjb25mbGljdHMucG9wKCkKICAgICAgICBmaWxlU2l6ZVtpXSwgZmlsZVNpemVbal0gPSBmaWxlU2l6ZVtqXSwgZmlsZVNpemVbaV0KICAgICAgICBpZiBmaWxlU2l6ZVtpXSAhPSBhZmZpbml0eVtpXSBhbmQgZmlsZVNpemVbal0gIT0gYWZmaW5pdHlbal06CiAgICAgICAgICAgIHN3YXBzICs9IDEKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gLTEKCiAgICBpZiBjb25mbGljdHM6CiAgICAgICAgcmV0dXJuIC0xCiAgICByZXR1cm4gc3dhcHMKcHJpbnQoY2FsY3VsYXRlTWluaW11bVN3YXBzKFsxLDIsMSwyLDEsMl0sWzEsMSwyLDIsMSwyXSkp