int main()
{
cin >> t;
while (t--)
{
int n,x;cin >> n;
vector<vector<int> > pre(n+1, vector<int>(201));//每个位置中每个数的前缀个数
vector<vector<int> >v(201);
f(i, 1, n)
{
scanf("%d", &x);
f(j, 1, 200)pre[i][j] = pre[i - 1][j] + (x == j);
v[x].emplace_back(i);//记录每种数字的所有出现位置
}
int ans = 0;
f(i, 1, 200)//200,枚举以每种数字为两端
{
ans = max(ans, (int)v[i].size());//单个数
f(j,1,v[i].size()/2)//由三部分构成,对称取
{
int l = v[i][j - 1]+1, r = v[i][v[i].size() - j]-1;
f(k, 1, 200)//枚举中间部分
{
ans = max(ans, j * 2 + pre[r][k] - pre[l-1][k]);
}
}
}
cout << ans << endl;
}
return 0;
}
E2 - Three Blocks Palindrome (hard version)(前缀,枚举)
最新推荐文章于 2021-02-09 15:35:00 发布