题目要求找到满足条件 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 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录