合并两个数组,让我们求其中元素相同的子串的最大值,我们应该怎么想呢?
统计每一个字串数字出现的次数,然后贪心来做出每一次选择,我们很快就能找到反例。
那么,应该怎么做呢?
我们是要找出一个最大的元素相同长度,那就是要让尽可能多的相同元素放在一起,而随后我们也可以发现一点,任意两个子串其实是能够连接在一起的,那么接下来的思路也就很简单了。
我们可以分别遍历两个数组,然后在每一次遍历中求出每一个数字在两个子串中的最大连续长度,最后,通过相加比较找出最大的连续长度。
#include <bits/stdc++.h>
using namespace std;
const int N = 200010;
int a[N];
int b[N];
int ans1[N * 2];
int ans2[2 * N];
#pragma GCC optimize(2)
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int t;
cin >> t;
while (t--) {
memset(ans1, 0, sizeof(ans1));
memset(ans2, 0, sizeof(ans2));
int n;
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
for (int i = 1; i <= n; i++)
cin >> b[i];
int cnt = 1;
for (int i = 1; i < n; i++) {
if (a[i] == a[i + 1])
cnt++;
else {
ans1[a[i]] = max(cnt, ans1[a[i]]);
cnt = 1;
}
}
ans1[a[n]] = max(cnt, ans1[a[n]]);
cnt = 1;
for (int i = 1; i < n; i++) {
if (b[i] == b[i + 1])
cnt++;
else {
ans1[b[i]] = max(cnt, ans1[b[i]]);
cnt = 1;
}
}
ans2[b[n]] = max(cnt, ans2[b[n]]);
int ans = 1;
for (int i = 1; i <= n; i++)
ans = max(ans, max(ans1[a[i]] + ans2[a[i]], ans1[b[i]] + ans2[b[i]]));
cout << ans << "\n";
}
}