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

题面

洛谷

给定一个纯随机的\(01\)串,每次询问\([L,R]\)之间所有后缀两两之间的\(LCP\)的最大值。

题解

一个暴力的想法是构建\(SA\)之后把所有位置按照\(rank\)排序,每次询问相邻的两个\(LCP\)就行了,然后拿\(set\)维护插入的操作。

然而并没有用到串随机的性质。

既然是随机的,那么大力猜一猜他们的\(lcp\)的长度不会很长,大概估计一个\(40\)左右吧。

把询问离线挂在右端点上,从左往右把每个后缀的前\(40\)个位置插入\(trie\)数,记录可以取到\(LCP\)为每个值的时候的最靠右的端点,然后统计一下就好了。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
#define MAX 100100
#define mp make_pair
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int n,Q,p[MAX],ans[MAX];char ch[MAX];
int L[MAX],R[MAX];
vector<int> A[MAX];
int fr[MAX];
struct Node{int ch[2],lst;}t[MAX*50];
int tot=1;
void Insert(int p)
{
int nw=1;fr[0]=p;
for(int i=p;i<=n&&i<=p+40;++i)
{
int c=ch[i]-48;
if(!t[nw].ch[c])t[nw].ch[c]=++tot;
nw=t[nw].ch[c];
fr[i-p+1]=max(fr[i-p+1],t[nw].lst);
t[nw].lst=p;
}
}
int main()
{
n=read();Q=read();scanf("%s",ch+1);
for(int i=1;i<=Q;++i)L[i]=read(),R[i]=read(),A[R[i]].push_back(i);
for(int i=1;i<=n;++i)
{
Insert(i);
for(int q:A[i])
{
int sum=0;
for(int j=1;j<=40;++j)
if(fr[j]>=L[q])sum+=fr[j]-L[q]+1;
ans[q]=sum;
}
}
for(int i=1;i<=Q;++i)printf("%d\n",ans[i]);
return 0;
}

【Luogu3732】[HAOI2017]供给侧改革(Trie树)的更多相关文章

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

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

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

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

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

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

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

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

  5. [HAOI2017]供给侧改革

    题目 这道题我们其实就是利用了一棵后缀树 由于字符串是随机的,所以这个后缀树的树高是\(log\)的,基于树高的算法是能过的 我们考虑后缀树上的两个节点的\(lca\)就是这两个节点所代表的后缀的\( ...

  6. 基于trie树做一个ac自动机

    基于trie树做一个ac自动机 #!/usr/bin/python # -*- coding: utf-8 -*- class Node: def __init__(self): self.value ...

  7. 基于trie树的具有联想功能的文本编辑器

    之前的软件设计与开发实践课程中,自己构思的大作业题目.做的具有核心功能,但是还欠缺边边角角的小功能和持久化数据结构,先放出来,有机会一点点改.github:https://github.com/chu ...

  8. hihocoder-1014 Trie树

    hihocoder 1014 : Trie树 link: https://hihocoder.com/problemset/problem/1014 题意: 实现Trie树,实现对单词的快速统计. # ...

  9. 洛谷P2412 查单词 [trie树 RMQ]

    题目背景 滚粗了的HansBug在收拾旧英语书,然而他发现了什么奇妙的东西. 题目描述 udp2.T3如果遇到相同的字符串,输出后面的 蒟蒻HansBug在一本英语书里面找到了一个单词表,包含N个单词 ...

随机推荐

  1. c# winform导出Excel

    //需要注意添加引用Microsoft.Office.Interop.Excel.dll string fileName =DateTime.Now.Year+ DateTime.Now.Month+ ...

  2. laravel中migration 数据迁移

    简介 数据库迁移就像是数据库的版本控制,可以让你的团队轻松修改并共享应用程序的数据库结构.迁移通常与 Laravel 的数据库结构生成器配合使用,让你轻松地构建数据库结构.如果你曾经试过让同事手动在数 ...

  3. spark、standalone集群 (2)集群zookeeper 热备

     测试 cmd     spark-examples-1.6.0-hadoop2.6.0.jar   spark 2.0以后  就没有这个 jar.需要下载 ./bin/spark-submit -- ...

  4. 谷歌浏览器报错 Active resource loading counts reached to a per-frame

    Active resource loading counts reached to a per-frame limit while the tab is in background. Network ...

  5. maven中jar下载失败

    关键词:maven jar 错误描述:反编译时遇到 invalid LOC header (bad signature)的问题 aether-89969cb8-5741-44e3-be2c-74f90 ...

  6. spring 给一个类 生成test

    右击一个类,然后:GoTo==>test ,就可以新建这个类的测试用例了,简单粗暴, 如果想要不污染数据库,就在一个测试用例 的标签@Test 下面在加上@RollBack 这样: @Test ...

  7. mobile adaptor & css media query

    mobile adaptor & css media query 移动端适配 & 媒体查询 http://cssmediaqueries.com/ device-aspect-rati ...

  8. Google浏览器解决编码乱码问题

    新版google浏览器编码乱码没有设置的入口,怎么办呢?. 步骤一: 可以下载goole的插件,名为charset,下载后的文件名为Charset_v0.4.1 步骤二: google右上角-> ...

  9. Java中的super()使用注意

    1)super(参数):调用基类中的某一个构造函数(应该为构造函数中的第一条语句)2)this(参数):调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句)3)super: 它引用当前对象的 ...

  10. 一、VS2017支持Github

    选择 工具-->扩展和更新,搜索GitHub,安装GitHub的VS插件 安装完插件,打开视图-->团队资源管理器,我们可以看到Git插件菜单.通过菜单我们可以新建Git存储库,可以提交修 ...