题目链接:点击查看

题目大意:给出n个数组成的数列,现在规定一种结构满足以下条件:

  1. 该结构由三个部分组成
  2. 第一个部分与第三个部分相等
  3. 第一个部分与第二个部分对称

现在问数列中最长的可以组成该结构的字串的长度

题目分析:对于题目中的条件,我们换句话来解释,还是三个部分,显然第一个部分和第二个部分可以组成回文串,第二个部分可以和第三个部分组成回文串,而且组成的回文串还都是偶回文串,既然涉及到了字串和回文串,我们可以先用马拉车跑一下以每个位置为终点的回文串长度,此后就可以暴力维护答案了,既然是要求两个回文串,且必须满足其中间有交集,则只需满足:

  1. 设x为回文串1和回文串2中点位置的距离
  2. 回文串1的右半部分大于等于x
  3. 回文串2的左半部分大于等于x

如果满足上述三个条件,那么必然可以构造出一种题目要求的数列,且长度为x*3,如此暴力维护一下最大值就是答案了

不得不说,这个题我是不太敢暴力的,但加上了最优性剪枝,以及适当的break之后,其实暴力起来的时间复杂度远远小于n*n,反而更接近O(n)

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=2e5+100;int a[N],p[N],n;void Manacher()
{p[0]=1;int id=0,mmax=0;for(int i=1;i<n;i++){if(i<mmax)p[i]=min(mmax-i,p[2*id-i]);elsep[i]=1;while(a[i-p[i]]==a[i+p[i]])p[i]++;if(i+p[i]>mmax){mmax=i+p[i];id=i;}p[i]--;//这里减一代表的是不算当前位置可以向左或向右扩展多少个单位 }
} int main()
{
//  freopen("input.txt","r",stdin);
//  ios::sync_with_stdio(false);int w;cin>>w;int kase=0;while(w--){int nn;scanf("%d",&nn);n=0;a[n++]=-1;while(nn--){a[n++]=0;scanf("%d",&a[n++]);}a[n++]=0;a[n++]=-1;Manacher();int ans=0;for(int i=1;i<n;i+=2)//枚举第一个回文串的中点,因为要跳过'#',所以每次加二for(int j=i+p[i];j-i>ans;j-=2)//枚举第二个回文串的中点,同理每次减二 if(j-i<=p[j]){ans=max(ans,j-i);break;}printf("Case #%d: %d\n",++kase,ans/2*3);}return 0;
}

HDU - 5371 Hotaru's problem(马拉车+暴力)相关推荐

  1. HDU 5371 Hotaru's problem(Manacher算法+贪心)

    manacher算法详见 http://blog.csdn.net/u014664226/article/details/47428293 题意:给一个序列,让求其最大子序列,这个子序列由三段组成, ...

  2. HDU 1557 权利指数 国家压缩 暴力

    HDU 1557 权利指数 状态压缩 暴力 ACM 题目地址:HDU 1557 权利指数 题意:  中文题,不解释. 分析:  枚举全部集合,计算集合中的和,推断集合里面的团体是否为关键团队. 代码: ...

  3. hdu 5008 Boring String Problem(后缀数组+rmq)

    题目链接:hdu 5008 Boring String Problem 题意: 给你一个字符串,有q个询问,每次询问该字符串所有的子串中字典序第k小的是哪个串,输出位置,如果有多个位置,输出最靠左的那 ...

  4. HDU.1002 A + B Problem II

    原题 HDU.1002 A + B Problem II 分类 杂题·大位整数运算 题意 计算从任意两个长度在1000以内的正整数的和. 输入/输出 要求与格式 输入内容 最开始一行开始输入样例数,对 ...

  5. HDU.1000 A + B Problem

    前言 本人目前大二,目前正值新型肺炎疫情期间,空余时间与其在家里无所事事,倒不如每天刷上一两道算法题.写写解题报告总结总结. 所以每天都写至少一篇题解博客吧,同时也希望全国的疫情能快速消退,加油! 原 ...

  6. HDU 5371 Manacher Hotaru's problem

    求出一个连续子序列,这个子序列由三部分ABC构成,其中AB是回文串,A和C相同,也就是BC也是回文串. 求这样一个最长的子序列. Manacher算法是在所有两个相邻数字之间插入一个特殊的数字,比如- ...

  7. HDOJ 1016 HDU 1016 Prime Ring Problem ACM 1016 IN HDU

    题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=1016 题目描述: Prime Ring Problem Time Limit: 4000/2000 ...

  8. hdu 3706 Second My Problem First 单调队列

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3706 Second My Problem First Time Limit: 12000/4000 M ...

  9. HDU 5944 Fxx and string(暴力/枚举)

    传送门 Fxx and string Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Othe ...

最新文章

  1. 如何导入给定名称的模块为字符串?
  2. hive 数据存储格式详解
  3. [Spring cloud 一步步实现广告系统] 16. 增量索引实现以及投送数据到MQ(kafka)
  4. .NET Core微服务之基于Ocelot实现API网关服务(续)
  5. java堆内存与栈内存区别
  6. the vm session was closed before any attempt to power it on
  7. 巧用PHP中__get()魔术方法
  8. HDUOJ----4501小明系列故事——买年货(三维背包)
  9. 核心API最佳实践——JDK日志分级
  10. Cisco路由器故障诊断技术(3)
  11. 【Android】Android Studio中新创建的app目录结构
  12. 7系统启动到一半停止_扛不住了!可口可乐巨震:500个品牌砍一半,裁员4000人.........
  13. 数百台湾人把名字改成“鲑鱼”去吃免费日料,结果有人改不回来了
  14. greensock下载_GreenSock面向初学者:Web动画教程(第1部分)
  15. 浏览器突然无法打开微信链接解决办法
  16. 南华大学计算机考研真题,2021南华大学考研历年真题复习资料
  17. hadoop+Spark实战基于大数据技术之电视收视率企业项目实战
  18. [Vuetify] 解决mainterialicon加载慢
  19. 浅谈 iframe的优缺点以及使用场景
  20. mysql时间类型之按时间排序精确到毫秒

热门文章

  1. oracle 数据 导出 excel 自动分多个文件,从oracle数据库中导出大量数据到excel中为什么自动分成了好几个excel文件《excel表格新手入门》...
  2. MySQL等值连接的介绍
  3. Junit_测试概述
  4. 配置解决中文乱码的过滤器
  5. 格式化输出浮点型变量
  6. RaDirect交换器-搭建环境
  7. gradle 构建完成自动删除_Gradle 6.6 RC6 发布,引入配置缓存特性,大幅提升构建性能
  8. return和break的区别
  9. MySQL逻辑物理备份测试
  10. android手机卫士、3D指南针、动画精选、仿bilibli客户端、身份证银行卡识别等源码...