【bzoj4896】[Thu Summer Camp2016]补退选 Trie树+STL-vector
题目描述
输入
输出
样例输入
6
1 lcaq
3 lca 0 0 5
1 lcq
3 lc 0 1 5
2 lcaq
3 lc 0 1 5
样例输出
1
3
3
题解
Trie树+STL-vector(不需要可持久化)
由于对答案有贡献,只有当某个前缀的字符串数量第一次超过某值。
所以我们可以建立一棵Trie树,根到每个节点的路径表示一个前缀。
在每个节点上开一个vector,记录该前缀的字符串数量第一次超过0、1、...时的事件编号。
这样在查询的时候可以直接找到该前缀的vector,判断并输出即可。
另外,尽管样例中出现了l、q等非前10个字母,但开前10个字母的的数组,亲测是可以过的。
所以经计算,极限空间复杂度为O(n*60*(10+1+1)),并不会炸空间。
(当然开26个字母,把Trie树节点强行压到300000也是可以过的(所以不存在正解,因为无论如何都会MLE))。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define N 6000010
using namespace std;
vector<int> v[N];
int next[N][10] , now[N] , tot;
char str[100];
int main()
{
int n , i , j , t , l , last = 0 , opt , a , b , c;
scanf("%d" , &n);
for(i = 1 ; i <= n ; i ++ )
{
scanf("%d%s" , &opt , str) , l = strlen(str);
if(opt == 1)
{
for(t = j = 0 ; j < l ; j ++ )
{
if(!next[t][str[j] - 'a']) next[t][str[j] - 'a'] = ++tot;
t = next[t][str[j] - 'a'] , now[t] ++ ;
if(v[t].size() < now[t]) v[t].push_back(i);
}
}
else if(opt == 2)
for(t = j = 0 ; j < l ; j ++ )
t = next[t][str[j] - 'a'] , now[t] -- ;
else
{
scanf("%d%d%d" , &a , &b , &c) , a = ((long long)a * abs(last) + b) % c;
for(t = j = 0 ; j < l ; j ++ )
{
if(!next[t][str[j] - 'a']) next[t][str[j] - 'a'] = ++tot;
t = next[t][str[j] - 'a'];
}
if(v[t].size() <= a) last = -1;
else last = v[t][a];
printf("%d\n" , last);
}
}
return 0;
}
【bzoj4896】[Thu Summer Camp2016]补退选 Trie树+STL-vector的更多相关文章
- 【BZOJ4896】[Thu Summer Camp2016]补退选 Trie树
[BZOJ4896][Thu Summer Camp2016]补退选 Description X是T大的一名老师,每年他都要教授许多学生基础的C++知识.在T大,每个学生在每学期的开学前都需要选课,每 ...
- BZOJ 4896 :[Thu Summer Camp2016]补退选 Trie树+Vector
4896: [Thu Summer Camp2016]补退选 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 315 Solved: 97[Submi ...
- BZOJ4896 [Thu Summer Camp2016]补退选 【trie树】
题目链接 BZOJ4896 题解 \(thu\)怎么那么喜欢出\(trie\)树的题... 我们当然可以按题意模拟建\(trie\) 询问的时候,由于存在删除操作,不满足单调性,不能直接二分答案 我们 ...
- BZOJ 4896 [Thusc2016]补退选 (Trie树维护vector)
题目大意:略 这竟然是$thusc$的题... 先把询问里加入的串全拎出来,建出$Trie$树,$Trie$里每个节点都开一个$vector$记录操作标号,再记录操作数量$sum$ 然后瞎**搞搞就行 ...
- BZOJ4896 [Thu Summer Camp2016]补退选
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- BZOJ 4896: [Thu Summer Camp2016]补退选
trie树+vector+二分 别忘了abs(ans) #include<cstdio> #include<algorithm> #include<vector> ...
- [Thu Summer Camp2016]补退选
题目描述不说了. 题解: Trie+vector…… Trie存学生,vector存答案. 极为无脑但无脑到让人怀疑 代码: #include<cmath> #include<vec ...
- [BZOJ4896][THUSC2016]补退选(Trie)
4896: [Thu Summer Camp2016]补退选 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 653 Solved: 228[Subm ...
- LOJ 2991 「THUSC 2016」补退选——trie+线段树合并或vector
题目:https://loj.ac/problem/2291 想了线段树合并的做法.就是用线段树维护 trie 的每个点在各种时间的操作. 然后线段树合并一番,线段树维护前缀最大值,就是维护最大子段和 ...
随机推荐
- vim 编辑器的使用方法
vim 命令模式 默认打开文件为命令模式 命令行模式 shift+: 命令行模式 编辑模式 i 编辑模式 Esc 切换命令模式 命令模式 -----字符操作 i 当 ...
- python __getattr__ __setattr__
class Rectangle: def __init__(self): self.width = 0 self.height = 0 def __setattr__(self, key, value ...
- MySql-8.0.12 安装教程随笔
下载地址: https://www.mysql.com/downloads/ 现在最下边的社区版本,也就是免费版本 之后我们会看到有两个选择的下载,一个为zip压缩包格式,一个是Install版本,个 ...
- 避免修改Android.mk添加cpp文件路径
手工输入项目需要编译的cpp文件到Android.mk里的缺点 1)繁琐,如果cpp文件很多,简直无法忍受 2)手工输入过程中容易出现错误 3)如果cpp文件更改名称,需要修改android.mk文件 ...
- 二十一、MySQL NULL 值处理
MySQL NULL 值处理 我们已经知道 MySQL 使用 SQL SELECT 命令及 WHERE 子句来读取数据表中的数据,但是当提供的查询条件字段为 NULL 时,该命令可能就无法正常工作. ...
- 搭建zipkin参数配置
Environment Variables zipkin-server is a drop-in replacement for the scala query service. yaml confi ...
- centos7上mysql8.0rpm方式安装
首先是下载图解 1.首先卸载centos7中自带的mariadb rpm -qa|grep mariadb //查询出来已安装的mariadb rpm -e --nodeps 文件名 //卸载mari ...
- Python9-条件-定时器-队列-day40
复习 线程 线程是进程中的执行单位 线程是cpu执行的最小单位 线程之间资源共享 线程的开启和关闭以及切换的时间开销远远小于进程 线程本身可以在同一时间使用多个cpu,python与线程 由于cpyt ...
- NAND Flash和NOR Flash的比较
目前Flash主要有两种NOR Flash和NADN Flash.NOR Flash的读取和我们常见的SDRAM的读取是一样,用户可以直接运行装载在NOR FLASH里面的代码,这样可以减少SRAM的 ...
- Kubernetes添加带Quota限额的CephFS StorageClass
1. 在Ceph上为Kubernetes创建一个文件系统 # ceph osd pool create cephfs_data # ceph osd pool create cephfs_metada ...