【Luogu3732】[HAOI2017]供给侧改革(Trie树)
【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树)的更多相关文章
- Luogu3732 [HAOI2017] 供给侧改革 【后缀数组】【线段树】【乱搞】
		题目分析: 这道题我是乱搞的,因为他说$01$串是随机的. 那么我们可以猜测能够让LCP变大的地方很少.求出后缀数组之后可能让LCP变大的地方就等价于从大到小往height里动态加点同时维护这个点左右 ... 
- 洛谷3732:[HAOI2017]供给侧改革——题解
		https://www.luogu.org/problemnew/show/P3732 Anihc国提高社会生产力水平.落实好以人民为中心的发展思想.决定进行供给侧结构性改革. 为了提高供给品质.你调 ... 
- 洛谷 P3732 [HAOI2017]供给侧改革【trie树】
		参考:http://blog.csdn.net/di4covery/article/details/73065684 我以为是后缀数组+某某数据结构,结果居然是01trie!!题解说"因为是 ... 
- [HAOI2017]供给侧改革[离线、trie]
		题意 题目链接 分析 由于数据随机所以 LCP 不会很长,维护每个位置后 40 个字符构成的01串. 将询问离线维护,以当前右端点为 R 的每个长度的 LCP 的第一个出现位置 f(这个信息显然是单调 ... 
- [HAOI2017]供给侧改革
		题目 这道题我们其实就是利用了一棵后缀树 由于字符串是随机的,所以这个后缀树的树高是\(log\)的,基于树高的算法是能过的 我们考虑后缀树上的两个节点的\(lca\)就是这两个节点所代表的后缀的\( ... 
- 基于trie树做一个ac自动机
		基于trie树做一个ac自动机 #!/usr/bin/python # -*- coding: utf-8 -*- class Node: def __init__(self): self.value ... 
- 基于trie树的具有联想功能的文本编辑器
		之前的软件设计与开发实践课程中,自己构思的大作业题目.做的具有核心功能,但是还欠缺边边角角的小功能和持久化数据结构,先放出来,有机会一点点改.github:https://github.com/chu ... 
- hihocoder-1014 Trie树
		hihocoder 1014 : Trie树 link: https://hihocoder.com/problemset/problem/1014 题意: 实现Trie树,实现对单词的快速统计. # ... 
- 洛谷P2412 查单词 [trie树 RMQ]
		题目背景 滚粗了的HansBug在收拾旧英语书,然而他发现了什么奇妙的东西. 题目描述 udp2.T3如果遇到相同的字符串,输出后面的 蒟蒻HansBug在一本英语书里面找到了一个单词表,包含N个单词 ... 
随机推荐
- <iOS开发>之App上架流程(2017)
			本文主要介绍了App上架流程,以及上架过程中会遇到的一些问题. 一.App上架前的准备. 上架前,需要开发人员有苹果开发者账号,具体请阅读苹果开发者账号注册申请流程.本文是在已经拥有开发者账号的前提下 ... 
- net core 小坑杂记之配置文件读取 02 (控制器里读)
			上次更新博客的时候提到了如何在EF的上下文里读取配置,这次介绍一下在控制器里如何读取. 先说一种简单易懂的: 首先以键值对的形式在appsettings里添加一条配置信息,接着Startup里注入配置 ... 
- 单列模式,装饰器、new方法、类/静态方法实现单列模式
			一.单列模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在. 如,某个服务器程序的配置信息存放在一个文件中,客户端通过一个 C ... 
- ReentrantLock源码分析
			参考: 五月的仓颉 ReentrantLock实现原理 活在梦里 AQS源码解读 重入锁是基于AQS实现的,它提供了公平锁和非公平锁两个版本的实现. public class ReentrantLoc ... 
- hadoop实例-网站用户行为分析
			一.数据集 网站用户购物行为数据集2030万条,包括raw_user.csv(2000万条)和small_user.csv(30万条,适合新手) 字段说明: user_id 用户编号,item_id ... 
- asp.net mvc导出execl_转载
			public FileResult ExportExcel() { var sbHtml = new StringBuilder(); sbHtml.Append("<table bo ... 
- jmeter 启动jmeter-server.bat远程调用报错: java.io.FileNotFoundException: rmi_keystore.jks (系统找不到指定的文件。)
			1.找到apache-jmeter-5.0\bin\jmeter.properties 2.修改server.rmi.ssl.disable=true (记得去除server.rmi.ssl.disa ... 
- Linux df 与du用法
			df 查看一级目录的大小,但是不能查看文件的大小.du 可以查看目录或者文件大小. 1 df的基本用法 df命令可以显示目前所有文件系统的总空间及当前可用空间,用法如下: -a 全部文件系统列表-h ... 
- CLOUD计算产品成本嵌套
			1.产品入库单入库的半成品A (无单价) 2.其他出库单上(共耗的)出库的半成品A(无单价) 不管在同车间还是不同车间内都是认定为嵌套的,所以可以计算2遍成本,第1遍不考虑嵌套,第2遍就能计算进去了. 
- C# Note7:MVVM模式之数据绑定
			一.资源说明 (1)本文参考自: 一步步走进WPF的MVVM模式(二):数据绑定 WPF之数据绑定总结 二.正文 数据绑定 (Data Binding)是WPF最重要的特性之一,也是实现 MVVM( ... 
