[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号 会议 ...
随机推荐
- JavaWeb学习 (十八)————JSP标签
一.JSP标签介绍 JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护. 二.JSP常用标签 ...
- Jmeter配置通过SSH连接的mysql数据库
jmeter连接配置mysql数据库时,如果数据库服务器没有通过ssh连接,则只需要添加配置相应的jdbc参数就可以了.如果数据库服务器是通过SSH连接的,则需要通过中间远程连接工具来登录,此处使用的 ...
- Xshell6设置字体大小
Xshell可以远程连接到linux服务器,但有时终端字体太小,可以按照如下步骤修改字体大小: 菜单栏: 文件-属性-外观,修改字体大小后点击确定即可(也可以使用ALT+P快捷键打开属性).
- ElasticSearch入门简介
ElasticSearch是基于Apache Lucene的分布式搜索引擎, 提供面向文档的搜索服务.本文以6.2.3版本为例介绍ElasticSearch的应用. 本文首先介绍ElasticSear ...
- vi/vim使用
移动光标上:k nk:向上移动n行 9999k或gg可以移到第一行 G移到最后一行下:j nj:向下移动n行左:h nh:向左移动n列右:l nl:向右移动n列 w:光标以单词向前移动 nw:光标向前 ...
- Visual Studio 2015 激活码
专业版:HMGNV-WCYXV-X7G9W-YCX63-B98R2 企业版:HM6NR-QXX7C-DFW2Y-8B82K-WTYJV
- 【github&&git】2、github入门到上传本地项目
[在原文章的基础上,修改了描述的不够详细的地方,对内容进行了扩充,整合了网上的一些资料] [内容主要来自http://www.cnblogs.com/specter45/p/github.html#g ...
- 性能监控(3)–linux下的iostat命令
iostat可以显示cpu与磁盘信息,添加-d参数可以只显示磁盘信息
- 【Mybatis】一对多实例
①创建数据库和表,数据库为mytest,表为teacher和student DROP TABLE IF EXISTS teacher; DROP TABLE IF EXISTS student; CR ...
- polyfill-eventsource added missing EventSource to window ie浏览器 解决方案
今天遇到一个 ie浏览器显示空白,报错内容是: polyfill-eventsource added missing EventSource to window的问题, import 'babel-p ...