hdu5371 manacher + 线段树
这题说的找出一个数组串 3等分 第一个部分和第3个部分一样,第二个部分和第一个部分回文,那么计算出这些字符串问这样的字符串最长为多少,我们先使用manacher 计算出每个位置以他为对称轴左边端点的最长回文半径 加入第i个位置 回文半径为 d[i],那么他能影响的范围为d[i]-i至i 如果他是那个最大的那么答案就是 i-j (j为[d[i]-i,i]之间的数),我们可以再适当的点加入这个位置的影响在线段树中,然后在最后使用线段树查找出这个区间的最值是多少
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string.h>
#include <vector>
using namespace std;
const int maxn=;
int str[maxn];
int s[maxn*];
int rad[maxn*];//以i为中心的回文串 半径
int H[maxn],to[maxn],nx[maxn],numofedg;
int d[maxn];
void addedg(int u, int v)
{
++numofedg; to[numofedg]=v; nx[numofedg]=H[u]; H[u]=numofedg;
}
void manacher(int len)
{ int cur=;
s[]=-;
for(int i=; i<len; i++)
{
s[cur++]=str[i];
s[cur++]=-;
}
rad[]=;
int id=;
for(int i=; i<cur; i++)
{
if(rad[id]+id>i)rad[i]=min(rad[*id-i],rad[id]+id-i);
else rad[i]=;
while(i-rad[i]>=&&i+rad[i]<cur&&s[ i - rad[i] ] == s[ i+rad[i] ])rad[i]++;
if(id+rad[i]<i+rad[i])id=i;
}
for(int i=; i<=len; i++)
{
d[i]=rad[i*]/;
if(d[i]==)continue;
addedg(i-d[i],i);
} }
struct Itree
{
int loc,cL,cR,ans;
int val[maxn*];
void build(int L, int R, int o)
{
val[o]=;
if(L==R) return ;
int mid=(L+R)>>;
build(L,mid,o*);
build(mid+,R,o*+);
}
void update(int L, int R, int o)
{
if(L==R)
{
val[o]=L ; return ;
}
int mid=(L+R)>>;
if(loc<=mid) update(L,mid,o*);
else update(mid+,R,o*+);
val[o]=max(val[o*],val[o*+]);
}
void query(int L, int R, int o)
{
if(cL<=L&&R<=cR)
{
ans=max(ans,val[o]); return;
}
int mid=(L+R)>>;
if(cL<=mid)query(L,mid,o*);
if(cR>mid) query(mid+,R,o*+);
}
}T;
int main()
{
int cas;
scanf("%d",&cas); for(int cc=; cc<=cas; cc++)
{
int n;
scanf("%d",&n);
H[]=;numofedg=;
for(int i=; i<n; i++){
H[i+]=;
scanf("%d",&str[i]);
}
manacher(n);
int ans=;
T.build(,n,);
d[]=;
for(int i=; i<n; i++)
{
for(int j=H[i]; j; j=nx[j])
{
T.loc=to[j]; T.update(,n,);
}
T.cL=i+;T.cR=d[i]+i;
if(T.cL>T.cR)continue;
T.ans=;
T.query(,n,);
ans=max(ans,T.ans-i);
}
printf("Case #%d: %d\n",cc,ans*);
}
return ;
}
hdu5371 manacher + 线段树的更多相关文章
- bzoj 2565: 最长双回文串【manacher+线段树】
因为我很愚蠢所以用了很愚蠢的O(nlogn)的manacher+线段树做法 就是开两个线段树mn和mx分别表示左端点在i的最长回文子串和右端点在i的最长回文子串 用manacher求出每个点的最长回文 ...
- 洛谷P4555 [国家集训队]最长双回文串(manacher 线段树)
题意 题目链接 Sol 我的做法比较naive..首先manacher预处理出以每个位置为中心的回文串的长度.然后枚举一个中间位置,现在要考虑的就是能覆盖到i - 1的回文串中 中心最靠左的,和能覆盖 ...
- 计蒜之道 初赛 第三场 题解 Manacher o(n)求最长公共回文串 线段树
腾讯手机地图 腾讯手机地图的定位功能用到了用户手机的多种信号,这当中有的信号的作用范围近.有的信号作用的范围则远一些.有的信号相对于用户在不同的方位强度是不同的,有的则是在不论什么一个方向上信号强度都 ...
- 牛客练习赛64 如果我让你查回文你还爱我吗 线段树 树状数组 manacher 计数 区间本质不同回文串个数
LINK:如果我让你查回文你还爱我吗 了解到了这个模板题. 果然我不会写2333... 考试的时候想到了一个非常辣鸡的 线段树合并+莫队的做法 过不了不再赘述. 当然也想到了manacher不过不太会 ...
- bzoj3932--可持久化线段树
题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...
- codevs 1082 线段树练习 3(区间维护)
codevs 1082 线段树练习 3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...
- codevs 1576 最长上升子序列的线段树优化
题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...
- codevs 1080 线段树点修改
先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...
- codevs 1082 线段树区间求和
codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...
随机推荐
- day3_字典
一.说明 字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中 ,格式如下所示: dict = {key1:value1,key2 ...
- 洛谷P3722 影魔 [AH2017/HNOI2017] 线段树+扫描线
正解:线段树+扫描线 解题报告: 传送门! 先理解一下这道题,大概是这样儿的: 对于一个点对,如果他们的两端是这段区间的最大值和次大值,那么他们会有p1的贡献 如果他们的两端是最大值和一个非次大值,那 ...
- zabbix准备:php安装
一.安装php依赖库 ftp://xmlsoft.org/libxml2/libxml2-2.9.3.tar.gz yum install python-devel -y cd /download/ ...
- java应用零停机,时间索引重建(reindex)
一个field的设置是不能被修改的,如果要修改一个Field,那么应该重新按照新的mapping,建立一个index,然后将数据批量查询出来,重新用bulk api写入index中 批量查询的时候,建 ...
- @property专题
“属性” (property)作为 Objective-C 的一项特性,主要的作用就在于封装对象中的数据. Objective-C 对象通常会把其所需要的数据保存为各种实例变量.实例变量一般通过“存取 ...
- yaml语言在线可视化翻译
yaml语言在线可视化翻译 https://editor.swagger.io/
- (1.7)mysql profiles分析
mysql profiles分析 作用:记录会话查询SQL所用时间 1.开启 2.使用 [2.1]先使用一个查询 [2.2]然后再运行 show profiles; [2.3]查看执行过程中每个状态和 ...
- zabbix基础知识
zabbix监控 初级 1.识别监控对象(分级) 2.理解监控对象(理论知识) 3.细分监控对象的指标 4.确定报警的基准线 预中级 1.工具化和监控分离 2.监控对象的分类 2.1硬件监控(方法:机 ...
- HIVE简单操作
1.hive命令登录HIVE数据库后,执行show databases;命令可以看到hive数据库中有一个默认的default数据库. [root@hadoop hive]# hive Logging ...
- JetBrains 2017/2018全系列产品激活工具
可谓是工欲善其事,必先利其器,相信作为优秀开发工程师的你都想拥有一套快捷高效的编码工具,而JetBrains这家公司的产品,不管是那种编程语言,其开发工具确实让开发者们着迷,JetBrains的产品博 ...