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是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...
随机推荐
- Windows7安装两个jdk配置
win7 配置两个jdk,之前装了jdk1.6,项目需要安装1.8. 首先去oracle官网下载一个和你eclipse版本一致的jdk(我的是32位). 网址:https://www.oracle.c ...
- 联系customer的js
import api from '@/js/api'; export var conService = function getInfoSend() { var loginState = localS ...
- flex布局 响应式布局
移动端页面开发流程 移动端页面布局 一.移动端app分类 1.Native App原生app手机应用程序 使用原生的语言开发的手机应用,Android系统用的是java,ios系统用的是objec ...
- maven工程中防止mapper.xml文件被漏掉、未加载的方法
maven工程中防止mapper.xml文件被漏掉.未加载的方法 就是在pom.xml文件中添加以下内容 <!-- 如果不添加此节点mybatis的mapper.xml文件都会被漏掉. --&g ...
- Machine Learning in action --LogisticRegession 逻辑回归
本系列主要参考<机器学习实战>,使用python3编译环境,实现书中的相关代码. 1.基本算法 关于梯度上升算法和随机梯度上升算法的选择: 当数据集较小时,使用梯度上升算法: 当数据集较大 ...
- IntelliJ配置SpringMVC提示“found:java.lang.String required:java.lang.String”
File->Invalid Cache&Restart 据说Android Studio也会出现这个问题,但是没遇到过 重启环境后,找不到Controller的问题也解决了
- RN animated组动画
代码: export default class AnimationGroupScene extends Component { constructor() { super() ) ) ) } com ...
- Java基础知识(JAVA之IO流)
学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各 ...
- Python3学习之路~3.2 递归、函数式编程、高阶函数、匿名函数、嵌套函数
1 递归 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. def calc(n): print(n) if int(n / 2) == 0: return n r ...
- ORACLE12C架构图