CFB. Array merging

 

 合并两个数组,让我们求其中元素相同的子串的最大值,我们应该怎么想呢?

统计每一个字串数字出现的次数,然后贪心来做出每一次选择,我们很快就能找到反例。

那么,应该怎么做呢?

我们是要找出一个最大的元素相同长度,那就是要让尽可能多的相同元素放在一起,而随后我们也可以发现一点,任意两个子串其实是能够连接在一起的,那么接下来的思路也就很简单了。

我们可以分别遍历两个数组,然后在每一次遍历中求出每一个数字在两个子串中的最大连续长度,最后,通过相加比较找出最大的连续长度。

#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";
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值