代码参考: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)的更多相关文章

  1. CF - 1108 E 枚举上界+线段树维护

    题目传送门 枚举每个点作为最大值的那个点.然后既然是作为最大值出现的话,那么这个点就是不需要被减去的,因为如果最小值也在这个区间内的话,2者都减去1,对答案没有影响,如果是最小值不出现在这个区间内的话 ...

  2. Codeforces Round #271 (Div. 2) E题 Pillars(线段树维护DP)

    题目地址:http://codeforces.com/contest/474/problem/E 第一次遇到这样的用线段树来维护DP的题目.ASC中也遇到过,当时也非常自然的想到了线段树维护DP,可是 ...

  3. Codeforces 750E - New Year and Old Subsequence(线段树维护矩阵乘法,板子题)

    Codeforces 题目传送门 & 洛谷题目传送门 u1s1 我做这道 *2600 的动力是 wjz 出了道这个套路的题,而我连起码的思路都没有,wtcl/kk 首先考虑怎样对某个固定的串计 ...

  4. 洛谷 P7879 -「SWTR-07」How to AK NOI?(后缀自动机+线段树维护矩乘)

    洛谷题面传送门 orz 一发出题人(话说我 AC 这道题的时候,出题人好像就坐在我的右侧呢/cy/cy) 考虑一个很 naive 的 DP,\(dp_i\) 表示 \([l,i]\) 之间的字符串是否 ...

  5. [BZOJ 1018] [SHOI2008] 堵塞的交通traffic 【线段树维护联通性】

    题目链接:BZOJ - 1018 题目分析 这道题就说明了刷题少,比赛就容易跪..SDOI Round1 Day2 T3 就是与这道题类似的..然而我并没有做过这道题.. 这道题是线段树维护联通性的经 ...

  6. 洛谷P4243/bzoj1558 [JSOI2009]等差数列(线段树维护差分+爆炸恶心的合并)

    题面 首先感谢这篇题解,是思路来源 看到等差数列,就会想到差分,又有区间加,很容易想到线段树维护差分.再注意点细节,\(A\)操作完美解决 然后就是爆炸恶心的\(B\)操作,之前看一堆题解的解释都不怎 ...

  7. [动态dp]线段树维护转移矩阵

    背景:czy上课讲了新知识,从未见到过,总结一下. 所谓动态dp,是在动态规划的基础上,需要维护一些修改操作的算法. 这类题目分为如下三个步骤:(都是对于常系数齐次递推问题) 1先不考虑修改,不考虑区 ...

  8. bzoj 4184: shallot (线段树维护线性基)

    题面 \(solution:\) 这一题绝对算的上是一道经典的例题,它向我们诠释了一种新的线段树维护方式(神犇可以跳过了).像这一类需要加入又需要维护删除的问题,我们曾经是遇到过的像莫对,线段树... ...

  9. FJUT3568 中二病也要敲代码(线段树维护区间连续最值)题解

    题意:有一个环,有1~N编号,m次操作,将a位置的值改为b,问你这个环当前最小连续和多少(不能全取也不能不取) 思路:用线段树维护一个区间最值连续和.我们设出两个变量Lmin,Rmin,Mmin表示区 ...

随机推荐

  1. Linux 查看内存使用情况

    1 . top  : 用于实时显示 process 的动态 PID:进程的ID USER:进程所有 PR:进程的优先级别,越小越优先被执 VIRT:进程占用的虚拟内 RES:进程占用的物理内 SHR: ...

  2. 《算法导论》——随机化快排RandomizedQuickSort

    今日算法:随机化快排RandomizedQuickSort 基础工作swap交换和partition分治 /* *交换数组的两个元素 *fromIndex和toIndex为要交换的两个元素的索引 */ ...

  3. Halcon旋转图片的研究

    在Halcon中有两个用于图像旋转的函数: 1,rotate_image *Image和ImageRotate分别是输入和输出图像 *Phi是输入的旋转度数 *interpolation是内插方式,默 ...

  4. python大法好——模块(内置模块未完)

    模块 模块是非常简单的Python文件,单个Python文件就是一个模块,两个文件就是两个模块. Python模块有什么作用? 1.模块内有许多函数方法,利用这些方法可以更简单的完成许多工作.2.模块 ...

  5. jsp页面中比较“接收数据”与“页面循环数据”是否相等

    页面中关系运算符: -lt 小于 -le   小于或者等于 -gt 大于 -ge 大于或者等于 -eq 等于 -ne 不等于 判空:<c:if test="${empty count  ...

  6. oracle数据库中存储过程使用MD5算法加密

    一.技术点 1. DBMS_OBFUSCATION_TOOLKIT.MD5 DBMS_OBFUSCATION_TOOLKIT.MD5是MD5编码的数据包函数,但偶在使用select DBMS_OBFU ...

  7. LAMP架构

    LAMP(linux,apache,mysql,php)是linux系统下常用的网站架构模型,用来运行PHP网站.(这得apache是httpd服务),这些服务可以安装同意主机上,也可以安装不同主机上 ...

  8. 前端 跨Area后Cookie无法访问

    创建两个区域,一个是User,一个是Manage. User区域有两个页面,index1,和index2 User区域: index1:负责写入cookie index2:负责读取cookie Man ...

  9. kalman filter卡尔曼滤波器- 数学推导和原理理解-----网上讲的比较好的kalman filter和整理、将预测值和观测值融和

    = 参考/转自: 1 ---https://blog.csdn.net/u010720661/article/details/63253509 2----http://www.bzarg.com/p/ ...

  10. 2、订单填写页面 /items/write?skuId=10&orderNo=201903211033410001

    <template> <div class="write"> <div class="adr" v-if="addres ...