题目链接:点击查看

题目大意:给出 three blocks palindrome 的定义,为 aa....aa + bb....bb + aa....aa 三个部分组成的字符串,其中第一段为 x ,第二段为 y ,第三段为 x ,x 和 y 的长度可以为 0 ,第一段和第三段必须完全一致,且某一段中的字符必须只有一种,换句话说,three blocks palindrome 只由至多两种不同的字符组成,现在给出一个字符串 s ,可以挑选其子序列用来组成 three blocks palindrome ,求可以组成的最长 three blocks palindrome 是多长

题目分析:读完题后,因为字符种类比较小,所以考虑对于每个字符单独维护一下前缀和,这样就能O(1)求出某段区间内某个字符出现的次数,之后在没看数据范围的前提下,第一反应是一层 for 枚举 a ,一层 for 枚举 b ,然后双指针O( n )维护最大值,时间复杂度为 200 * 200 * n 看了数据范围后,这样的方法可以去水过 E1 ,而无法过 E2,考虑优化,在外层枚举 a 的时候,没必要每次都O( n )遍历所有字符,只需要枚举字符 a 出现的位置就行了,内层依然是一层 for 枚举 b 维护最大值,这样均摊下来时间复杂度为 200 * n ,就能过 E2 了,至于如何只枚举字符 a 出现的位置呢?开一个 vector 记录一下每个字符的出现位置就好了

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<unordered_map>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=2e5+100;int sum[N][210];vector<int>pos[210];int main()
{
#ifndef ONLINE_JUDGE
//  freopen("input.txt","r",stdin);
//  freopen("output.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);int w;cin>>w;while(w--){int n;scanf("%d",&n);for(int i=1;i<=200;i++)pos[i].clear();for(int i=1;i<=n;i++){int num;scanf("%d",&num);pos[num].push_back(i);for(int j=1;j<=200;j++)sum[i][j]=sum[i-1][j];sum[i][num]++;}int ans=0;for(int i=1;i<=200;i++)//x的长度为0时ans=max(ans,sum[n][i]);for(int i=1;i<=200;i++){int sz=pos[i].size();for(int j=0;j<sz/2;j++){int l=pos[i][j],r=pos[i][sz-1-j];ans=max(ans,(j+1)*2);//y的长度为0时for(int k=1;k<=200;k++)ans=max(ans,(j+1)*2+sum[r-1][k]-sum[l][k]);}}printf("%d\n",ans);}return 0;
}

CodeForces - 1335E2 Three Blocks Palindrome (hard version)(思维)相关推荐

  1. CodeForces - 1559D2 Mocha and Diana (Hard Version)(思维)

    题目链接:点击查看 题目大意:给出两棵森林,每次可以同时在两个森林中增加同一条边,问最多可以增加多少条边,使得两个森林仍然还是森林 题目分析:结论参考至:https://blog.csdn.net/R ...

  2. cf #634 (Div. 3) E2 - Three Blocks Palindrome (hard version)

    思路: 因为每个数比较小,可以从这里切入,开始想的是枚举中间那部分,但是中间固定了2边不好确定,因为2边要一样,所以我们可以固定2边,然后对于中间位置,只需找出出现次数最多的数,前缀和预处理一下.枚举 ...

  3. E:Three Blocks Palindrome(hard and easy)(树状数组 ? 前缀和?)

    Three Blocks Palindrome (hard version) 思路 考虑到每个数字的范围是12001 ~ 2001 200,于是我们可以通过枚举两侧的元素来寻找最优答案. 我们有一个贪 ...

  4. Codeforces Round #617 (Div. 3) E2. String Coloring (hard version) 思维 + dp + Dilworth定理

    传送门 文章目录 题意: 思路: 题意: 让你给一个串染色,不同颜色且相邻的一对字符可以互换位置,用最少的颜色,使交换后这个字符串字典序最小. 思路: 考虑将字符串分成若干个非递减的子序列,由于其非递 ...

  5. Codeforces Round #601 (Div. 2) E2. Send Boxes to Alice (Hard Version) 思维 + 质因子

    传送门 文章目录 题意: 思路: 题意: 大体题意跟easyeasyeasy版本差不多,就是hardhardhard版本的aaa范围更大.见这里Codeforces Round #601 (Div. ...

  6. 【CodeForces - 574D】Bear and Blocks (dp,思维)

    题干: Limak is a little bear who loves to play. Today he is playing by destroying block towers. He bui ...

  7. CodeForces - 1450C2 Errich-Tac-Toe (Hard Version)(思维+构造)

    题目链接:点击查看 题目大意:给出一个大小为 n * m 的棋盘,规定不能有三个连续的 ' X ' 或三个连续的 ' O ' ,现在可以通过一次操作将 ' X ' 改成 ' O ' 或者将 ' O ' ...

  8. CodeForces - 1326D2 Prefix-Suffix Palindrome (Hard version)(马拉车/回文自动机)

    题目链接:点击查看 题目大意:给出一个字符串,求出截取前缀和后缀后拼接而成的最长回文串,前缀和后缀不能相交 题目分析:题意很简单,思路也不难想,读完题后我尝试性的看了看样例,发现前缀和后缀拼接后如果能 ...

  9. CodeForces - 1486C2 Guessing the Greatest (hard version)(二分+交互)

    题目链接:点击查看 题目分析:给出一个长度为 nnn 的序列,现在可以进行最多 202020 次查询,每次查询可以询问区间 [l,r][l,r][l,r] 中次大值的位置,现在要求在查询后输出最大值的 ...

最新文章

  1. SFB 项目经验-65-使用域管理员安装不了Exchange 2010 SP3 CU21
  2. Ubuntu 下 apt-get 命令
  3. php html转成数组,PHP_php将HTML表格每行每列转为数组实现采集表格数据的方法,本文实例讲述了php将HTML表格每 - phpStudy...
  4. Spark SQL兼容Hive及扩展
  5. [转]MVC+JQuery validate实现用户输入验证
  6. 揭秘全球第二大基金公司:先锋基金70人投资团队掌管2万亿美元股票资产
  7. mysql数据库引擎问题
  8. 利用python实现键盘连点器
  9. 基于Python3的格雷厄姆 股票估值模型
  10. 数据集的文字标签(label)转成数字标签
  11. 如何查找国内各大学本科学位论文?
  12. 模拟频率、数字频率、模拟角频率之间的关系
  13. vm虚拟服务器无法启动,win10升级后vm虚拟主机无法启动的解决办法
  14. uniapp 动画的实现
  15. ST-Link烧写简单总结
  16. 中国类脑计算先行者:在AI“无人区”探路
  17. Oracle19c数据库下载及安装步骤(详细)以及连接Navicat和PLSql
  18. 用php写表格代码,php读写excel表格程序代码
  19. GICV2GICV3的基础知识
  20. 微信读书无限卡组队群,一起领取无限卡!

热门文章

  1. 集群资源分配_分析下 Node.js 关于集群的那些事
  2. Paxos在Chubby中的应用
  3. 再述Spring AOP 应用场景
  4. Redis中的过期策略
  5. serialVersionUIDtransient
  6. spring配置详解-属性注入(p名称空间SPEL表达式)
  7. win7电脑总是提示重新启动计算机以完成重要更新的安装是怎么回事,Win7开机时弹出Windows Update提示,怎样解决?(图文)...
  8. mycat配置访问oracle_教程 | MySql都会了,确定不学习一下MyCat分片?
  9. jar打包 剔除第三方依赖以及它的依赖_为什么Spring Boot的 jar 可以直接运行?
  10. free: seconds argument `1‘ failed