题目

这道题我们其实就是利用了一棵后缀树

由于字符串是随机的,所以这个后缀树的树高是\(log\)的,基于树高的算法是能过的

我们考虑后缀树上的两个节点的\(lca\)就是这两个节点所代表的后缀的\(lcp\)

我们可以把询问按照右端点离线,每次都暴力跳这个在后缀树上暴力跳父亲

我们维护一下后缀树上子树里的最大值,这样我们就可以维护出对于每一种\(lcp\)出现最靠后的位置在哪里了

对于每次询问我们扫一遍这些个\(lcp\)就好了

至于如何建一棵后缀树,自然是把原串反着建一个SAM啊

代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define re register
#define LL long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
inline int read() {
char c=getchar();int x=0;while(c<'0'||x>'9') c=getchar();
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
const int maxn=2e5+5;
struct Ask{int l,r,rk;}q[maxn>>1];
int cnt=1,lst=1,len[maxn],son[maxn][2],fa[maxn];
int pos[maxn>>1],lcp[maxn>>1],mx[maxn],g[maxn>>1],h[maxn>>1];
int n,m,T;LL Ans[maxn>>1];char S[maxn>>1];
inline int cmp(Ask A,Ask B) {return A.r<B.r;}
inline void Extend(int c,int o) {
int p=++cnt,f=lst;lst=p;
len[p]=len[f]+1,pos[o]=p;
while(f&&!son[f][c]) son[f][c]=p,f=fa[f];
if(!f) {fa[p]=1;return;}
int x=son[f][c];
if(len[f]+1==len[x]) {fa[p]=x;return;}
int y=++cnt;
len[y]=len[f]+1,fa[y]=fa[x],fa[x]=fa[p]=y;
son[y][0]=son[x][0],son[y][1]=son[x][1];
while(f&&son[f][c]==x) son[f][c]=y,f=fa[f];
}
inline void ins(int i) {
int x=pos[i];
while(x) {
lcp[len[x]]=max(lcp[len[x]],mx[x]);
if(lcp[len[x]]) T=max(T,len[x]);
mx[x]=max(mx[x],i);x=fa[x];
}
}
inline void calc(int j) {
int t=q[j].r-1,tmp=0;
LL ans=0;
for(re int i=1;i<=T;++i)
if(lcp[i]) {
while(lcp[i]>=g[tmp]&&tmp) tmp--;
g[++tmp]=lcp[i],h[tmp]=i;
}
g[tmp+1]=0;
for(re int i=2;i<=tmp+1;i++) {
if(g[i]<q[j].l) {
ans+=(g[i-1]-q[j].l+1)*h[i-1];
break;
}
ans+=(g[i-1]-g[i])*h[i-1];
}
Ans[q[j].rk]=ans;
}
int main() {
n=read(),m=read();scanf("%s",S+1);
for(re int i=1;i<=m;i++) q[i].l=read(),q[i].r=read(),q[i].rk=i;
for(re int i=n;i;--i) Extend(S[i]-'0',i);
std::sort(q+1,q+m+1,cmp);ins(1);int tot=1;
for(re int i=2;i<=n;i++) {
ins(i);
while(q[tot].r==i) calc(tot++);
}
for(re int i=1;i<=m;i++) printf("%lld\n",Ans[i]);
return 0;
}

[HAOI2017]供给侧改革的更多相关文章

  1. 【Luogu3732】[HAOI2017]供给侧改革(Trie树)

    [Luogu3732][HAOI2017]供给侧改革(Trie树) 题面 洛谷 给定一个纯随机的\(01\)串,每次询问\([L,R]\)之间所有后缀两两之间的\(LCP\)的最大值. 题解 一个暴力 ...

  2. 洛谷3732:[HAOI2017]供给侧改革——题解

    https://www.luogu.org/problemnew/show/P3732 Anihc国提高社会生产力水平.落实好以人民为中心的发展思想.决定进行供给侧结构性改革. 为了提高供给品质.你调 ...

  3. Luogu3732 [HAOI2017] 供给侧改革 【后缀数组】【线段树】【乱搞】

    题目分析: 这道题我是乱搞的,因为他说$01$串是随机的. 那么我们可以猜测能够让LCP变大的地方很少.求出后缀数组之后可能让LCP变大的地方就等价于从大到小往height里动态加点同时维护这个点左右 ...

  4. [HAOI2017]供给侧改革[离线、trie]

    题意 题目链接 分析 由于数据随机所以 LCP 不会很长,维护每个位置后 40 个字符构成的01串. 将询问离线维护,以当前右端点为 R 的每个长度的 LCP 的第一个出现位置 f(这个信息显然是单调 ...

  5. 洛谷 P3732 [HAOI2017]供给侧改革【trie树】

    参考:http://blog.csdn.net/di4covery/article/details/73065684 我以为是后缀数组+某某数据结构,结果居然是01trie!!题解说"因为是 ...

  6. HAOI2017 简要题解

    「HAOI2017」新型城市化 题意 有一个 \(n\) 个点的无向图,其中只有 \(m\) 对点之间没有连边,保证这张图可以被分为至多两个团. 对于 \(m\) 对未连边的点对,判断有哪些点对满足将 ...

  7. 连载《一个程序猿的生命周期》-《发展篇》 - 3.农民与软件工程师,农业与IT业

    相关文章:随笔<一个程序猿的生命周期>- 逆潮流而动的“叛逆者”        15年前,依稀记得走出大山,进城求学的场景.尽管一路有父亲的陪伴,但是内心仍然畏惧.当父亲转身离去.准备回到 ...

  8. 关于C#本质论和CLR via C#中译本,不吐不快

    C#本质论和CLR via C#两本好书,周老师可能是俗务缠身,太忙了吧,翻译得只能让人呵呵了. 你要是忙,别接那么多活好不啦. 现在都在说供给侧改革,都在大力提倡工匠精神,我们做技术的,还是踏实点好 ...

  9. WGDC2019第八届全球地理信息开发者大会(北京)

    WGDC2019第八届全球地理信息开发者大会 会议召开时间:2019-07-09 08:00至 2019-07-10 18:00结束 会议召开地点:北京  北京国际会议中心  朝阳区北辰东路8号 会议 ...

随机推荐

  1. 如何在github上搭建一个免费的 无限流量的静态网页博客Github pages

    前言: 看到很多相关的教程,但是在实际操作的时候还是遇见了不少问题,这里记录分享一下我的操作流程.免费空间用过很多,博客也用过一些,听说了github后就想试着玩一下这个静态库,感觉挺不错的,操作也比 ...

  2. docker常用命令记录

    Docker官方镜像中心:https://hub.docker.com/explore/ 参考:慕课网docker视频教程 https://www.imooc.com/video/14625 1.启动 ...

  3. Linux tar 命令用法

    tar 命令可以为linux的文件和目录创建档案.利用 tar,可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件.tar 最初被用来在磁带上创建档案,现在,用户 ...

  4. 如何将自定义的搜索参数便捷的添加到js方式的bootstrap table的参数中

    页面: <div> <form id="exp_form"> 查询参数... <button type="button" oncl ...

  5. 【c#】6.0与7.0新特性介绍记录

    c#发展史 引用地址:https://www.cnblogs.com/ShaYeBlog/p/3661424.html 6.0新特性 1.字符串拼接优化 语法格式:$”string {参数}” 解释: ...

  6. 5.数码相框-额外项目电子书总结,并使用svgalib库

    在LCD显示任意编码的文本文件,类似电子书 怎样在LCD上显示文件: 需要哪几个文件? 1.顶部文件 通过main.c分析命令行的操作,然后初始化各个管理文件下的结构体,比如DisplayInit() ...

  7. java基础-配置java的环境变量

    学习java之前首先在https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html上面下载与 ...

  8. 140 - The 12th Zhejiang Provincial Collegiate Programming Contest(第二部分)

    Floor Function Time Limit: 10 Seconds      Memory Limit: 65536 KB a, b, c and d are all positive int ...

  9. 移动端FastClick和editor冲突问题。

        FastClick.prototype.needsClickForParent = function (target) {         let parent = target.parent ...

  10. vue选中与取消简单实现

    <li v-for="(item,index) in assign" :key="index" @click="selected(item)&q ...