Codeforces Round #634 (Div. 3) E —Three Blocks Palindrome 思维

补题
参考:https://blog.csdn.net/weixin_45750972/article/details/105523046

#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 210, M = 2e5+10;
//a[j,i]
//在前i个数字中,数字j出现在了多少次
int a[N][M];
void solve()
{
	//存每个数字 出现的位置
	vector<int>p[210];
	int n;
	int x;
	cin >> n;
	for(int i = 1; i <= n; i++)
	{
		cin >> x;
		for(int j = 1; j <= 200; j++)
			a[j][i] = a[j][i-1] + (x == j);
		p[x].push_back(i);
	}
	int ans = 0;
	//枚举每个数字 
	for(int k = 1; k <= 200; k++)
	{
		//只取一个相同的 
		ans = max(ans, (int)p[k].size()); 
		//把当前数字分到左右两边 
		for(int i = 1; i <= (p[k].size() / 2); i++)
		{
			//从左边数,数字k出现的第i次的位置
			//从右边数,数字k出现的第i次的位置 
			int l = p[k][i-1] + 1, r = p[k][p[k].size() - i] - 1;
			//找这中间出现次数最多的数字的次数 
			for(int j = 1; j <= 200; j++)
			{
				int x = a[j][r] - a[j][l-1];
				ans = max(ans, i*2 + x);
			}
		}
	}
	cout << ans << endl;
}
int main()
{
	int t;
	cin >> t;
	while(t --)
		solve();
	return 0;
}
posted @ 2020-04-16 13:45  晴屿  阅读(101)  评论(0编辑  收藏  举报