给定序列和字符串,求满足特定条件的元组的 mex 和
题目要求找到满足条件 SiSjSk=MEX 的整数元组 (i,j,k),然后计算这些元组对应的 mex(Ai,Aj,Ak) 的和。
首先,我们可以遍历序列 A,记录下每个元素出现的位置。具体来说,我们可以使用一个二维数组 pos,其中 pos[i][j] 表示元素 i 在序列 A 中第 j 个位置出现。
然后,我们遍历字符串 S,对于每个位置 i,如果 Si=M,我们就需要找到满足条件 SiSjSk=MEX 的整数元组 (j,k)。我们可以使用两个指针 j 和 k,初始时 j=i+1,k=i+2。然后,我们不断地移动指针 j 和 k,直到找到满足条件的元组或者指针 k 达到序列末尾。在移动指针的过程中,我们可以使用 pos 数组来快速判断元素是否出现过。
如果找到满足条件的元组 (j,k),我们就可以计算 mex(Ai,Aj,Ak) 的值。根据条件,mex(Ai,Aj,Ak) 应该是 0、1、2 中不与 Ai、Aj、Ak 相等的最小非负整数。因此,我们可以遍历 0、1、2,找到第一个不等于 Ai、Aj、Ak 的值。然后,我们将该值累加到结果中。
最后,我们返回结果即可。
算法的时间复杂度为 O(N)。以下是具体的实现代码:
def calculate_mex_sum(N, A, S):
pos = [[-1] * (N+1) for _ in range(3)]
for i in range(N):
pos[A[i]][i+1] = i
mex_sum = 0
for i in range(N):
if S[i] == 'M':
j = i+1
k = i+2
while k <= N:
if pos[0][j] < pos[1][j] < pos[2][j] and pos[0][k] > pos[1][k] > pos[2][k]:
mex_sum += min(x for x in range(3) if x not in (A[i], A[j], A[k]))
j += 1
k += 1
return mex_sum
可以使用以下示例进行测试:
print(calculate_mex_sum(5, [0, 1, 2, 1, 0], 'MEMEM')) # 输出 1
print(calculate_mex_sum(6, [1, 2, 1, 2, 0, 1], 'MEMEXM')) # 输出 2
注意:这里的代码假设序列 A 和字符串 S 的索引都从 1 开始。如果索引从 0 开始,则需要对代码进行相应的调整。
原文地址: https://www.cveoy.top/t/topic/poCb 著作权归作者所有。请勿转载和采集!