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是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...
随机推荐
- Java之旅_面向对象_包(Package)
http://www.runoob.com/java/java-package.html 包的作用: 1.把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用. 2.如同文件夹一样,包也采用 ...
- 内置函数time
time import time.time() # 浮点型,给计算机看,随机 时间有三种: First: 时间戳 (time.time()) Second: 结构化时间 可以修改 Third: ...
- docker+jenkins的构建历史记录(Build History)时间不正确
1.分别查看宿主机时间和容器时间 宿主机时间 root@fcaad17f146a:/# date Fri Jan :: CST 容器时间 [root@ ~]# docker exec -ti 8798 ...
- python的第三方库
python的第三方库 https://www.lfd.uci.edu/~gohlke/pythonlibs/
- ansible进阶模板和角色使用
使用场景 Ansible 由于采用ssh远程连接登录管理,虽然不需要额外安装agent,但是速度慢效率低.不适合管理大规模的主机一般最大规模在200-300台,超大规模的主机管理适合使用puppet ...
- 【剑指offer】两个链表的第一个公共结点
一.题目: 输入两个链表,找出它们的第一个公共结点. 二.思路: 思路一:模拟数组,进行两次遍历,时间复杂度O(n2) 思路二:假定 List1长度: a+n List2 长度:b+n, 且 a&l ...
- Java Script的用途(简介)
1.可以用来写入HTML输出 <script> document.write("<h1>This is a heading</h1>");//标 ...
- 帝国cms建站-动态获取栏目id
<?php $fcr=explode('|',$class_r[$GLOBALS[navclassid]][featherclass]); $topbclassid=$fcr[1]?$fcr[1 ...
- 爆破root密码hash John the Ripper和hydra爆破ssh密码
官方网站:http://www.openwall.com/john/ 下载:wget http://www.openwall.com/john/j/john-1.8.0.tar.gz 解压:tar - ...
- java.lang.SecurityException: Permission Denial: writing android.support.v4.content.FileProvider uri
在使用红米手机拍摄照片时,出现闪退的情况. 调用系统相机拍摄照片,使用FileProvider.getUriForFile传入Uri时,报异常 java.lang.SecurityException: ...