[ACM] 【prefix/子序列】Codeforces Round #634 (Div.3) Three Blocks Palindrome (easy version)

E1. Three Blocks Palindrome (easy version)

题意:给一个数组,找最长子序列,这个子序列满足回文。左右中三个部分,每个部分只由一种数字构成。左、右部分一样,左右部分数目可以同时为0。
在这里插入图片描述

思路:

这大概就是cf div3最喜欢的前缀和prefix题吧,我遇到第二次了(掩面)而且上次补题的时候依然不会做
大致思路就是,brute force遍历所有区间,找出同样区间中最长的可能的同一字母串。同时找两边的最长的等量的同一字母串。然后更新answer。
cnt储存每个字母的前缀和。

代码:

题解的代码写得太好了(基本抄袭),给自己留个纪念吧,下次遇到前缀和存状态字符串真的别再给我不会了QAQ

#include<bits/stdc++.h>
using namespace std;
#define f(i,n) for(int i=1;i<=int(n);++i)
#define fore(i,l,r) for(int i=int(l);i<=int(r);++i)
#define V vector<int>
#define VV vector<V>
int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		int n,tmp;
		scanf("%d",&n);
		V a(n+1);
		//for(auto &it:a)cin>>it;
		f(i,n)cin>>a[i];
		VV cnt(27,V(n+1));
		f(i,n){
			f(j,26)cnt[j][i]=cnt[j][i-1];
			++cnt[a[i]][i];
		}
		int ans=0;
		f(i,26) ans=max(cnt[i][n],ans);
		f(l,n-1) fore(r,l+1,n){
			int cntin=0,cntout=0;
			f(i,26){
				cntin=max(cntin,cnt[i][r]-cnt[i][l-1]);
				cntout=max(cntout,min(cnt[i][n]-cnt[i][r],cnt[i][l-1]));
			}
			ans=max(ans,cntin+cntout*2);
		}
		printf("%d\n",ans);
	}
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值