[HAOI2017]供给侧改革
这道题我们其实就是利用了一棵后缀树
由于字符串是随机的,所以这个后缀树的树高是\(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]供给侧改革的更多相关文章
- 【Luogu3732】[HAOI2017]供给侧改革(Trie树)
[Luogu3732][HAOI2017]供给侧改革(Trie树) 题面 洛谷 给定一个纯随机的\(01\)串,每次询问\([L,R]\)之间所有后缀两两之间的\(LCP\)的最大值. 题解 一个暴力 ...
- 洛谷3732:[HAOI2017]供给侧改革——题解
https://www.luogu.org/problemnew/show/P3732 Anihc国提高社会生产力水平.落实好以人民为中心的发展思想.决定进行供给侧结构性改革. 为了提高供给品质.你调 ...
- Luogu3732 [HAOI2017] 供给侧改革 【后缀数组】【线段树】【乱搞】
题目分析: 这道题我是乱搞的,因为他说$01$串是随机的. 那么我们可以猜测能够让LCP变大的地方很少.求出后缀数组之后可能让LCP变大的地方就等价于从大到小往height里动态加点同时维护这个点左右 ...
- [HAOI2017]供给侧改革[离线、trie]
题意 题目链接 分析 由于数据随机所以 LCP 不会很长,维护每个位置后 40 个字符构成的01串. 将询问离线维护,以当前右端点为 R 的每个长度的 LCP 的第一个出现位置 f(这个信息显然是单调 ...
- 洛谷 P3732 [HAOI2017]供给侧改革【trie树】
参考:http://blog.csdn.net/di4covery/article/details/73065684 我以为是后缀数组+某某数据结构,结果居然是01trie!!题解说"因为是 ...
- HAOI2017 简要题解
「HAOI2017」新型城市化 题意 有一个 \(n\) 个点的无向图,其中只有 \(m\) 对点之间没有连边,保证这张图可以被分为至多两个团. 对于 \(m\) 对未连边的点对,判断有哪些点对满足将 ...
- 连载《一个程序猿的生命周期》-《发展篇》 - 3.农民与软件工程师,农业与IT业
相关文章:随笔<一个程序猿的生命周期>- 逆潮流而动的“叛逆者” 15年前,依稀记得走出大山,进城求学的场景.尽管一路有父亲的陪伴,但是内心仍然畏惧.当父亲转身离去.准备回到 ...
- 关于C#本质论和CLR via C#中译本,不吐不快
C#本质论和CLR via C#两本好书,周老师可能是俗务缠身,太忙了吧,翻译得只能让人呵呵了. 你要是忙,别接那么多活好不啦. 现在都在说供给侧改革,都在大力提倡工匠精神,我们做技术的,还是踏实点好 ...
- WGDC2019第八届全球地理信息开发者大会(北京)
WGDC2019第八届全球地理信息开发者大会 会议召开时间:2019-07-09 08:00至 2019-07-10 18:00结束 会议召开地点:北京 北京国际会议中心 朝阳区北辰东路8号 会议 ...
随机推荐
- Mybatis之基于XML的调用存储过程与手动回滚事务
一.调用存储过程 一.返回单个值 1.存储过程准备 这里先创建一个存储过程,传入参数为age,传出参数为count.然后先测试一下是否正确. CREATE DEFINER=`root`@`localh ...
- S3C2440 DMA 驱动示例
将 DMA 抽象为一个字符设备,在初始化函数中调用 void *dma_alloc_writecombine(struct device *dev, size_t size, dma_addr_t * ...
- DotNetCore学习-2.程序启动
新创建的ASP.NET Core程序中包含两个文件,分别是Program.Startup.其中,Program中Main方法是整个应用程序的入口,该方法如下: var host = WebHost.C ...
- WINAPI实现简易扫雷游戏
//扫雷 #include <windows.h> #include <windowsx.h> #include <strsafe.h> #include < ...
- MSSQL存储过程应用
1.原始表inoutinfo 2.现在想输入时间范围和操作类型输出对应的结果 2.1创建存储过程 create proc selecttype@type nvarchar(10),@starttime ...
- php编程规范整理
该规范对其他语言,部分是通用的标准....好吧,废话不多说啦,直入正题: 1.PHP 编程规范与编码习惯最主要的有以下几点: 1 文件说明 2 function 函数体说明 3 代码缩进 4 if省略 ...
- Python全栈学习_day002作业
Day2作业及默写 1.判断下列逻辑语句的True,False. 1)1 > 1 or 3 < 4 or 4 > 5 and 2 > 1 and 9 > 8 or 7 & ...
- 读《阿里Java开发手册》总结(1)
一·命名约定 类名使用大驼峰式命名(领域模式相关命名除外:如DAO\VO\DO等). 常量必须全部大写,单词中间用“_”隔开(如MAX_COUNT). 抽象类命名使用Abstract或Base开头.异 ...
- 2017-12-01 中英文代码对比之ZLOGO 4 & LOGO
基于前文中文编程语言之Z语言初尝试: ZLOGO 4的一些评论, 此文尝试作一个非常简单的代码对比, 使讨论更加有实例根据. 下图是节选自前文最后的示例代码, 由于选取的对照LOGO版本 (alanc ...
- Android Color颜色代码
常用颜色代码 <?xml version="1.0" encoding="utf-8"?> <resources> <color ...