暑假训练round2 D: 好序列(Manacher)
Problem 1061: 好序列
Time Limits: 1000 MS Memory Limits: 65536 KB
64-bit interger IO format: %lld Java class name: Main
Description
杨神觉得好的序列需要符合这两个条件
1.这段序列可以平均分成三段,第一段和第三段相同
2.第二段与第一段相反
给你一个由n个非负整数组成的序列,问连续子序列是好序列时,该连续子序列的长度是多少。
Input
第一行为t 代表t组测试数据
第二行为n ( 1 <= n <= 100000)代表序列由n个非负整数组成
第三行为n个数 (ai < 100000)
Output
开始为"Case #i: " 后面跟着一个整数,代表最长的连续子序列为好序列的长度
Sample Input
1
10
2 3 4 4 3 2 2 3 4 4
Output for Sample Input
Case #1: 9
比赛的时候只知道用manacher,之后就感觉下标处理起来麻烦就没做了……,正确解法是枚举i的对称点i+p[i]-1,再从对称点再往回扫一遍,看看存不存在也能往回覆盖至i点,有的话就记录[当前点-i]为1.5段的长度即可。
代码:
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<sstream>
#include<cstring>
#include<cstdio>
#include<string>
#include<deque>
#include<stack>
#include<cmath>
#include<queue>
#include<set>
#include<map>
using namespace std;
#define INF 0x3f3f3f3f
#define MM(x,y) memset(x,y,sizeof(x))
#define LC(x) (x<<1)
#define RC(x) ((x<<1)+1)
#define MID(x,y) ((x+y)>>1)
typedef pair<int,int> pii;
typedef long long LL;
const double PI=acos(-1.0);
const int N=100010;
int arr[N],p[N*2];
int s[N*2];
int n;
void manacher()
{
MM(p,0);
MM(s,0);
int i, len=0;
s[len++]=-2;
s[len++]=-1;
for (i=0; i<n; i++)
{
s[len++]=arr[i];
s[len++]=-1;
}
int mx=0, idd=0;
for (i=0; i<len; i++)
{
if(mx>i)
p[i]=min(p[2*idd-i],mx-i);
else
p[i]=1;
while (s[i+p[i]]==s[i-p[i]])
p[i]++;
if(i+p[i]>mx)
{
mx=p[i]+i;
idd=i;
}
}
}
int main(void)
{
int tcase, i, j, cnt=0;
scanf("%d",&tcase);
while (tcase--)
{
MM(arr,0);
scanf("%d",&n);
for (i=0; i<n; i++)
scanf("%d",&arr[i]);
manacher();
int ans=0;
for (i=1; i<2*n+2; i+=2)
{
for (j=i+p[i]-1; j-i>ans; j-=2)//往回遍历
{
if(j-(p[j]-1)<=i)
{
if(j-i>ans)
{
ans=j-i;
break;
}
}
}
}
printf("Case #%d: %d\n",++cnt,3*(ans>>1));
}
return 0;
}
暑假训练round2 D: 好序列(Manacher)的更多相关文章
- 暑假训练round 3 题解
		今天做题运气出奇的好,除了几处小错误调试之后忘记改掉了……最后还AK了……虽然题目不难,学长也说是福利局,但是对个人的鼓励作用还是挺大的……至此暑假训练就结束了,也算没有遗憾……. 题解如下: Pro ... 
- [置顶]        2013_CSUST暑假训练总结
		2013-7-19 shu 新生训练赛:母函数[转换成了背包做的] shuacm 题目:http://acm.hdu.edu.cn/diy/contest_show.php?cid=20083总结:h ... 
- 2015暑假训练(UVALive 5983 - 5992)线段树离线处理+dp
		A: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=83690#problem/A 题意:N*M的格子,从左上走到右下,要求在每个点的权值 ... 
- 【BZOJ4166】月宫的符卡序列 Manacher+hash
		[BZOJ4166]月宫的符卡序列 题解:题倒不难,就是有点恶心. 首先学习回文串的时候一定学到了这样一个结论:一个长度为n的串的本质不同的回文子串数量不超过n个. 那么我们就可以试图将所有回文串的价 ... 
- 广大暑假训练1(poj 2488) A Knight's Journey   解题报告
		题目链接:http://vjudge.net/contest/view.action?cid=51369#problem/A (A - Children of the Candy Corn) ht ... 
- HNU暑假训练第一场C.Ninja Map
		一.题目大意 Intersections of Crossing Path City are aligned to a grid. There are N east-west streets whic ... 
- 暑假训练Round1——G: Hkhv的水题之二(字符串的最小表示)
		Problem 1057: Hkhv的水题之二 Time Limits: 1000 MS Memory Limits: 65536 KB 64-bit interger IO format: ... 
- 哈理工2015 暑假训练赛 zoj 2976 Light Bulbs
		MS Memory Limit:65536KB 64bit IO Format:%lld & %llu SubmitStatusid=14946">Practice ... 
- 广大暑假训练1  E题 Paid Roads(poj 3411)  解题报告
		题目链接:http://poj.org/problem?id=3411 题目意思:N个city 由 m 条路连接,对于一条路(假设连接Cityia和 Cityb),如果从Citya 去 Cityb的途 ... 
随机推荐
- 开源混淆工具ProGuard配置详解及配置实例
			ProGuard的作用: 1.创建紧凑的代码文档是为了更快的网络传输,快速装载和更小的内存占用. 2.创建的程序和程序库很难使用反向工程. 3.所以它能删除来自源文件中的没有调用的代码 4.充分利 ... 
- Spell checker(poj 1035)
			题意: 此题是一个字符串的问题,首先要给出一个字典,里面存储了数个单词.而后,给出一个单词,如果字典中存在,那么就输出correct,如果字典中没有,那么就要判断是不是这个单词有错误,错误有3 ... 
- KMP模式匹配
			http://www.cnblogs.com/wangguchangqing/archive/2012/09/09/2677701.html nextal[j+1]=next[j]+1 KMP算法的实 ... 
- duilib WindowImplBase BUG修复 --- 按一次ESC键, 关闭多个窗口
			BUG造成的影响 继承自WindowImplBase的窗口类, 如果没有重写重写ResponseDefaultKeyEvent而由WindowImplBase默认处理的话, 会导致按一次有ESC键, ... 
- ajax请求原理及jquery $.ajax封装全解析
			.ajax原理: Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,然后用javascript来操作DOM而更新页面.这其中最关键的一步就是从服务器获得 ... 
- mysql的多表查询
			转自:http://huaxia524151.iteye.com/blog/1423614 转自:http://blog.sina.com.cn/s/blog_4c197d420101cnm9.htm ... 
- Java Serializable(序列化)
			1.序列化是干什么的? 简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来.虽然你可以用你自己的各种各样的方法来保存object states,但 ... 
- java阿拉伯数字表示的金额转换成中文大写金额
			最大数字要处理到千亿也就是12位整数部分我们可以分成3段处理,xxxx亿,xxxx万,xxxx元,然后小数部分比较好处理我们发现0比较难处理什么时候会出现零呢那就是两个数字之间出现一个或多个零那么数字 ... 
- Ajax介绍
			AJAX AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). AJAX 不是新的编程语言,而是一种使用现有标准的新方法. AJA ... 
- Javascript的对象封装和继承有哪些方法?优劣分别是什么?
			1.对象封装方法 (1)原始模式生成对象 直接将我们的成员写入对象中,用函数返回. 缺点:很难看出是一个模式出来的实例. function Stu(name, score) { ... 
