cf 700e(sam好题,线段树维护right)
代码参考:http://blog.csdn.net/qq_33229466/article/details/79140428
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=;
int n,mx[maxn],ch[maxn][],fa[maxn],last=,id[maxn],tot=;
int dp[maxn],pos[maxn],cnt,b[maxn],c[maxn],root[maxn],ans;
char s[maxn];
struct node{
int l,r;
}tr[maxn*];
void add(int i,int x){
int p,q,np,nq;
p=last;last=np=++tot;mx[np]=mx[p]+;id[np]=i;
for(;!ch[p][x]&&p;p=fa[p])ch[p][x]=np;
if(!p)fa[np]=;
else{
q=ch[p][x];
if(mx[q]==mx[p]+)fa[np]=q;
else{
nq=++tot;mx[nq]=mx[p]+;id[nq]=i;
memcpy(ch[nq],ch[q],sizeof(ch[q]));
fa[nq]=fa[q];
fa[q]=fa[np]=nq;
for(;ch[p][x]==q;p=fa[p])ch[p][x]=nq;
}
}
}
void ins(int &d,int l,int r,int x){
if(!d)d=++cnt;
if(l==r)return;
int mid=l+r>>;
if(x<=mid)ins(tr[d].l,l,mid,x);
else ins(tr[d].r,mid+,r,x);
}
int merge(int x,int y){
if(!x||!y)return x+y;
int d=++cnt;
tr[d].l=merge(tr[x].l,tr[y].l);
tr[d].r=merge(tr[x].r,tr[y].r);
return d;
}
bool query(int d,int l,int r,int x,int y){
if(!d)return ;
if(l==x&&r==y)return ;
int mid=l+r>>;
if(x<=mid&&query(tr[d].l,l,mid,x,min(y,mid)))return ;
if(y>mid&&query(tr[d].r,mid+,r,max(x,mid+),y))return ;
return ;
}
void build(){
for(int i=;i<=tot;++i)b[mx[i]]++;
for(int i=;i<=tot;++i)b[i]+=b[i-];
for(int i=tot;i>=;--i)c[b[mx[i]]--]=i;
for(int i=tot;i>=;--i){
ins(root[c[i]],,n,id[c[i]]);
root[fa[c[i]]]=merge(root[fa[c[i]]],root[c[i]]);
}
}
int main(){
cin>>n;
scanf("%s",s+);
for(int i=;i<=n;++i)add(i,s[i]-'a');
build();
ans=;
for(int i=;i<=tot;++i){
int x=c[i];
if(fa[x]==)dp[x]=,pos[x]=x;
else if(query(root[pos[fa[x]]],,n,id[x]-mx[x]+mx[pos[fa[x]]],id[x]-)){dp[x]=dp[fa[x]]+;pos[x]=x;}
else {dp[x]=dp[fa[x]];pos[x]=pos[fa[x]];}
ans=max(ans,dp[x]);
}
cout<<ans;
return ;
}
cf 700e(sam好题,线段树维护right)的更多相关文章
- CF - 1108 E 枚举上界+线段树维护
题目传送门 枚举每个点作为最大值的那个点.然后既然是作为最大值出现的话,那么这个点就是不需要被减去的,因为如果最小值也在这个区间内的话,2者都减去1,对答案没有影响,如果是最小值不出现在这个区间内的话 ...
- Codeforces Round #271 (Div. 2) E题 Pillars(线段树维护DP)
题目地址:http://codeforces.com/contest/474/problem/E 第一次遇到这样的用线段树来维护DP的题目.ASC中也遇到过,当时也非常自然的想到了线段树维护DP,可是 ...
- Codeforces 750E - New Year and Old Subsequence(线段树维护矩阵乘法,板子题)
Codeforces 题目传送门 & 洛谷题目传送门 u1s1 我做这道 *2600 的动力是 wjz 出了道这个套路的题,而我连起码的思路都没有,wtcl/kk 首先考虑怎样对某个固定的串计 ...
- 洛谷 P7879 -「SWTR-07」How to AK NOI?(后缀自动机+线段树维护矩乘)
洛谷题面传送门 orz 一发出题人(话说我 AC 这道题的时候,出题人好像就坐在我的右侧呢/cy/cy) 考虑一个很 naive 的 DP,\(dp_i\) 表示 \([l,i]\) 之间的字符串是否 ...
- [BZOJ 1018] [SHOI2008] 堵塞的交通traffic 【线段树维护联通性】
题目链接:BZOJ - 1018 题目分析 这道题就说明了刷题少,比赛就容易跪..SDOI Round1 Day2 T3 就是与这道题类似的..然而我并没有做过这道题.. 这道题是线段树维护联通性的经 ...
- 洛谷P4243/bzoj1558 [JSOI2009]等差数列(线段树维护差分+爆炸恶心的合并)
题面 首先感谢这篇题解,是思路来源 看到等差数列,就会想到差分,又有区间加,很容易想到线段树维护差分.再注意点细节,\(A\)操作完美解决 然后就是爆炸恶心的\(B\)操作,之前看一堆题解的解释都不怎 ...
- [动态dp]线段树维护转移矩阵
背景:czy上课讲了新知识,从未见到过,总结一下. 所谓动态dp,是在动态规划的基础上,需要维护一些修改操作的算法. 这类题目分为如下三个步骤:(都是对于常系数齐次递推问题) 1先不考虑修改,不考虑区 ...
- bzoj 4184: shallot (线段树维护线性基)
题面 \(solution:\) 这一题绝对算的上是一道经典的例题,它向我们诠释了一种新的线段树维护方式(神犇可以跳过了).像这一类需要加入又需要维护删除的问题,我们曾经是遇到过的像莫对,线段树... ...
- FJUT3568 中二病也要敲代码(线段树维护区间连续最值)题解
题意:有一个环,有1~N编号,m次操作,将a位置的值改为b,问你这个环当前最小连续和多少(不能全取也不能不取) 思路:用线段树维护一个区间最值连续和.我们设出两个变量Lmin,Rmin,Mmin表示区 ...
随机推荐
- 性能测试day04_性能监控
好了,今天接着来学习性能,在今天开始前,我今天在网上又看到了理发师经典模型,这里稍微提一下,详情可以百度哈,下面这张图是网上找到的经典场景性能相关的图,大致说明下: 这张图中展示的是1个标准的软件性能 ...
- 学习笔记:Stage.js(又叫Cut.js)——2D canvas 开发库,游戏方面的
http://piqnt.com/stage.js/ http://www.bootcdn.cn/stage.js/ Stage.js(可能又叫Cut.js)是一个2D HTML5 JavaScrip ...
- python学习笔记_week28
heap import heapq import random heap = [] data = list(range(10000)) random.shuffle(data) # for num i ...
- hadoop 二次排序的思考
name sorce jx 10 gj 15 jx 20 gj 30 1. 二次排序 key如何定义 2. grouping 是不是一定要实现,不实现可以吗? 3. 二次排序的本质是什么 4. 如果以 ...
- 20165304第4次实验《Android程序设计》实验报告
一.实验报告封面 课程:Java程序设计 班级:1653班 姓名:李松杨 学号:20165304 指导教师:娄嘉鹏 实验日期:2018年5月14日 实验时间:15:35 - 17:15 实验序号:实验 ...
- Redis内存模型总结
一.Redis内存统计 在客户端通过redis-cli连接服务器后,通过info命令可以查看内存使用情况: info memory 返回结果中比较重要的几个说明如下: (1)used_memory:R ...
- board_led.h/board_led.c
/******************************************************************************* Filename: board_led ...
- centos安装tree命令
centos安装tree命令 sudo yum -y install tree windows安装tree命令 我的另一篇
- Linux-vim文本编辑器
[Vim文本编辑器] vim的三种模式:一般模式.编辑模式.命令模式. * 一般模式: 当你vim filename 编辑一个文件时,一进入该文件就是一般模式了.在这个模式下,你可以做的操作有,上下移 ...
- 关于 web 页面 占满全屏
页面一般可以分成三部分,头部,底部,中间内容部分. 一般不用考虑中间高度部分,因为可以靠内容撑开,然后让底部到达底部.但是当中间内容太少时,底部就会顶不到底部. 方法1.中间部分给一个最小高度(min ...