E2. Three Blocks Palindrome (hard version) (贪心&暴力)
思路:
AC代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int t,n;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
vector<vector<int> >a(201,vector<int>(n+1));
vector<vector<int> >p(201);//储存每个数的位置.
for(int i=1,x;i<=n;i++)
{
scanf("%d",&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++){ //O(n*200*200)
ans=max(ans,(int)p[k].size());//如果只取一个子串.
for(int i=1;i<=(p[k].size()/2);i++)//左右对称贪心思想.
{
int l=p[k][i-1]+1,r=p[k][p[k].size()-i]-1;//找到区间[l , r]
for(int j=1;j<=200;j++) //取最大值.
{
int x=a[j][r]-a[j][l-1];
ans=max(ans,i*2+x);
}
}
}
printf("%d\n",ans);
}
return 0;
}