📅  最后修改于: 2023-12-03 15:11:39.165000             🧑  作者: Mango
给定一个长度为 $n$ 的整数序列 $a_{1..n}$,你需要找出最长的连续子序列 $a_{l..r}$,使得在这个子序列中任意两个数的按位与操作(即 &)得到的结果都相同。
我们可以枚举所有可能的连续子序列,然后挑选出满足条件的子序列中最长的一个。
具体来说,我们可以首先枚举起点 $l$,然后枚举 $r$,满足 $l \leq r \leq n$。然后对于每个这样的 $l$ 和 $r$,我们需要判断 $a_{l..r}$ 是否满足条件。
为了方便检查,我们可以预处理出任意两个数的按位与操作(即 &)得到的结果,存储在一个二维数组 $g_{i,j}$ 中,其中 $i$ 和 $j$ 分别为序列中的两个下标。然后对于任意两个 $i \leq j \leq n$,我们可以通过 $g_{i-1,j} \neq g_{i,j}$ 或 $g_{i,j-1} \neq g_{i,j}$ 来判断子序列 $a_{i..j}$ 是否满足条件。
该算法的时间复杂度为 $O(n^3)$。由于数据范围较小,该算法可以通过本题。
n = int(input())
a = list(map(int, input().split()))
g = [[0] * n for _ in range(n)]
for i in range(n):
for j in range(i, n):
for k in range(i, j + 1):
g[i][j] &= a[k]
ans = 0
for i in range(n):
for j in range(i, n):
if all(g[i][j] == g[k][l] for k in range(i, j + 1) for l in range(k, j + 1)):
ans = max(ans, j - i + 1)
print(ans)
该代码使用 Python 语言实现。