HDU - 5371 Hotaru's problem(马拉车+暴力)
题目链接:点击查看
题目大意:给出n个数组成的数列,现在规定一种结构满足以下条件:
- 该结构由三个部分组成
- 第一个部分与第三个部分相等
- 第一个部分与第二个部分对称
现在问数列中最长的可以组成该结构的字串的长度
题目分析:对于题目中的条件,我们换句话来解释,还是三个部分,显然第一个部分和第二个部分可以组成回文串,第二个部分可以和第三个部分组成回文串,而且组成的回文串还都是偶回文串,既然涉及到了字串和回文串,我们可以先用马拉车跑一下以每个位置为终点的回文串长度,此后就可以暴力维护答案了,既然是要求两个回文串,且必须满足其中间有交集,则只需满足:
- 设x为回文串1和回文串2中点位置的距离
- 回文串1的右半部分大于等于x
- 回文串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(马拉车+暴力)相关推荐
- HDU 5371 Hotaru's problem(Manacher算法+贪心)
manacher算法详见 http://blog.csdn.net/u014664226/article/details/47428293 题意:给一个序列,让求其最大子序列,这个子序列由三段组成, ...
- HDU 1557 权利指数 国家压缩 暴力
HDU 1557 权利指数 状态压缩 暴力 ACM 题目地址:HDU 1557 权利指数 题意: 中文题,不解释. 分析: 枚举全部集合,计算集合中的和,推断集合里面的团体是否为关键团队. 代码: ...
- hdu 5008 Boring String Problem(后缀数组+rmq)
题目链接:hdu 5008 Boring String Problem 题意: 给你一个字符串,有q个询问,每次询问该字符串所有的子串中字典序第k小的是哪个串,输出位置,如果有多个位置,输出最靠左的那 ...
- HDU.1002 A + B Problem II
原题 HDU.1002 A + B Problem II 分类 杂题·大位整数运算 题意 计算从任意两个长度在1000以内的正整数的和. 输入/输出 要求与格式 输入内容 最开始一行开始输入样例数,对 ...
- HDU.1000 A + B Problem
前言 本人目前大二,目前正值新型肺炎疫情期间,空余时间与其在家里无所事事,倒不如每天刷上一两道算法题.写写解题报告总结总结. 所以每天都写至少一篇题解博客吧,同时也希望全国的疫情能快速消退,加油! 原 ...
- HDU 5371 Manacher Hotaru's problem
求出一个连续子序列,这个子序列由三部分ABC构成,其中AB是回文串,A和C相同,也就是BC也是回文串. 求这样一个最长的子序列. Manacher算法是在所有两个相邻数字之间插入一个特殊的数字,比如- ...
- 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 ...
- hdu 3706 Second My Problem First 单调队列
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3706 Second My Problem First Time Limit: 12000/4000 M ...
- HDU 5944 Fxx and string(暴力/枚举)
传送门 Fxx and string Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Othe ...
最新文章
- 如何导入给定名称的模块为字符串?
- hive 数据存储格式详解
- [Spring cloud 一步步实现广告系统] 16. 增量索引实现以及投送数据到MQ(kafka)
- .NET Core微服务之基于Ocelot实现API网关服务(续)
- java堆内存与栈内存区别
- the vm session was closed before any attempt to power it on
- 巧用PHP中__get()魔术方法
- HDUOJ----4501小明系列故事——买年货(三维背包)
- 核心API最佳实践——JDK日志分级
- Cisco路由器故障诊断技术(3)
- 【Android】Android Studio中新创建的app目录结构
- 7系统启动到一半停止_扛不住了!可口可乐巨震:500个品牌砍一半,裁员4000人.........
- 数百台湾人把名字改成“鲑鱼”去吃免费日料,结果有人改不回来了
- greensock下载_GreenSock面向初学者:Web动画教程(第1部分)
- 浏览器突然无法打开微信链接解决办法
- 南华大学计算机考研真题,2021南华大学考研历年真题复习资料
- hadoop+Spark实战基于大数据技术之电视收视率企业项目实战
- [Vuetify] 解决mainterialicon加载慢
- 浅谈 iframe的优缺点以及使用场景
- mysql时间类型之按时间排序精确到毫秒
热门文章
- oracle 数据 导出 excel 自动分多个文件,从oracle数据库中导出大量数据到excel中为什么自动分成了好几个excel文件《excel表格新手入门》...
- MySQL等值连接的介绍
- Junit_测试概述
- 配置解决中文乱码的过滤器
- 格式化输出浮点型变量
- RaDirect交换器-搭建环境
- gradle 构建完成自动删除_Gradle 6.6 RC6 发布,引入配置缓存特性,大幅提升构建性能
- return和break的区别
- MySQL逻辑物理备份测试
- android手机卫士、3D指南针、动画精选、仿bilibli客户端、身份证银行卡识别等源码...