【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 的每个点在各种时间的操作. 然后线段树合并一番,线段树维护前缀最大值,就是维护最大子段和 ...
随机推荐
- Exceptions and Errors on iOS
异常:程序缺陷导致:不可恢复:给开发者使用: 错误:资源受限导致:可恢复:提示给用户. https://blog.jayway.com/2010/10/13/exceptions-and-errors ...
- 查看数据库表存储引擎MyISAM/InnoDB
Mysql: show table status *MyISAM不支持PDO的事务
- Eureka 微服务注册中心搭建
本机IP为 192.168.1.102 1. 新建Maven项目 eureka 2. pom.xml <project xmlns="http://maven.apach ...
- vue中v-show和v-if的异同
一.官方解释: v-if 是“真正”的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建. v-if 也是惰性的:如果在初始渲染时条件为假,则什么也不做——直到条件第一次 ...
- Oracle Analyze
Analyze使用场景 之前很多次都说到,对表的索引等信息进行了增删改之后,需要对表进行analyze更新统计信息,才能使数据库做出最好的执行计划,没有注意到,即使是一张很小的空表,如果进行了字段的增 ...
- 黑马基础阶段测试题:定义一个int类型的数组,数组中元素为{5,7,3,9,4}。求出数组中的最小值,并判断最小值是否为偶数,如果是偶数则输出“最小值为偶数”,如果不是偶数则输出“最小值为奇数”。打印如下:
package com.swift; import java.util.Arrays; public class ArrayTest { public static void main(String[ ...
- python之斐波纳契数列
斐波纳契数列 斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,676 ...
- Cluster - 基本概念
1.1 什么是集群 简单的说,集群(cluster)就是一组计算机,它们作为一个整体向用户提供一组网络资源.这些单个的计算机系统就是集群的节点(node).一个理想的集群是,用户从来不会意识到集群系统 ...
- PHP 优化
来源:歪麦博客 https://www.awaimai.com/1050.html 1 字符串 1.1 少用正则表达式 能用PHP内部字符串操作函数的情况下,尽量用他们,不要用正则表达式, 因为其效率 ...
- TS各个表 与 SECTION 的解析 CAS原理
TS流,通过一个个的TS包来传送: TS包可以是传送PSI SI等各表的数据包,也可以是传送节目音视频数据(携带的PES包:音视频基本流包)的包:TS携带 PSI SI等表的数据时,各个表以各表对应的 ...