[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。

代码:

题解的代码写得太好了(基本抄袭),给自己留个纪念吧,下次遇到前缀和存状态字符串真的别再给我不会了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);
	}
} 
发布了20 篇原创文章 · 获赞 1 · 访问量 582

猜你喜欢

转载自blog.csdn.net/weixin_45497996/article/details/105585883
今日推荐