点此看题面

大致题意: 三种操作:加入一个字符串,删除一个字符串,求最早什么时候以某个字符串为前缀的字符串个数超过给定值。

\(Trie\)

这道题显然是\(Trie\)的暴力裸题。

考虑我们对于\(Trie\)上的每个节点,开一个\(vector\),其中第\(i\)位(注意\(vector\)的下标是从\(0\)开始的)存储以这个节点所代表的字符串为前缀的字符串个数超过\(i\)的最早时间。

至于这怎么维护,只要同时再维护一下对于每个字符串当前以其为前缀的字符串个数,由于这个个数每次最多修改\(1\),因此我们只要在每次修改时比较个数与\(vector\)的\(size\),若个数超过了\(vector\)的\(size\),就在\(vector\)中\(push\_back\)当前时间。

询问时只要找到对应节点,如果\(vector\)的\(size\)大于询问的给定值\(v\),就返回\(vector\)的第\(v\)位,否则返回\(-1\)。

关于内存

一开始,我很自信的把数组开到了\(10^5*60\),又由于没看见题目中说只有前十个小写字母,所以就完美地\(MLE\)了......

然后想了想发现\(Trie\)的数组是显然用不满的,但究竟该开多大呢?

思索半天没有结果,一狠心便去学了发指针实现\(Trie\),然后写完调了调\(bug\),就过了此题。

看看此时内存,仅有\(40.58MB\),真是无语......

代码

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 100000
#define K 60
using namespace std;
class FastIO
{
private:
#define FS 100000
#define tc() (A==B&&(B=(A=FI)+fread(FI,1,FS,stdin),A==B)?EOF:*A++)
#define pc(c) (C==E&&(clear(),0),*C++=c)
#define tn (x<<3)+(x<<1)
#define D isdigit(c=tc())
int T;char c,*A,*B,*C,*E,FI[FS],FO[FS],S[FS];
public:
I FastIO() {A=B=FI,C=FO,E=FO+FS;}
Tp I void read(Ty& x) {x=0;W(!D);W(x=tn+(c&15),D);}
Ts I void read(Ty& x,Ar&... y) {read(x),read(y...);}
I void reads(string& x) {x="";W(isspace(c=tc()));W(x+=c,!isspace(c=tc())&&~c);}
Tp I void write(Ty x) {x<0&&(pc('-'),x=-x);W(S[++T]=x%10+48,x/=10);W(T) pc(S[T--]);}
Tp I void writeln(Con Ty& x) {write(x),pc('\n');}
I void clear() {fwrite(FO,1,C-FO,stdout),C=FO;}
}F;
class Trie//指针实现Trie
{
private:
struct node
{
int V;node *S[10];vector<int> P;
I node() {V=0,P.clear();for(RI i=0;i^10;++i) S[i]=NULL;}//初始化清空节点,一定要写,不然会挂
}*rt;
public:
I Trie() {rt=new node;}//初始化根节点
I void Upt(Con string& s,CI v,CI ti)//修改(插入/删除)
{
node *x=rt;for(RI i=0,l=s.length(),t;i^l;++i)
x->S[t=s[i]-97]==NULL&&(x->S[t]=new node),x=x->S[t],//如果子节点为空,新建子节点
(x->V+=v)>x->P.size()&&(x->P.push_back(ti),0);//更新vector
}
I int Qry(Con string& s,CI v)//询问
{
node *x=rt;for(RI i=0,l=s.length(),t;i^l;++i)
if(x->S[t=s[i]-97]==NULL) return -1;else x=x->S[t];//如果子节点为空,直接返回-1
return x->P.size()>v?x->P[v]:-1;//判断是否有解,有解则返回答案,否则返回-1
}
}T;
int main()
{
RI Qt,i,op,x,y,z,lst=0;string s;for(F.read(Qt),i=1;i<=Qt;++i) switch(F.read(op),op)
{
case 1:F.reads(s),T.Upt(s,1,i);break;
case 2:F.reads(s),T.Upt(s,-1,i);break;
case 3:F.reads(s),F.read(x,y,z),F.writeln(lst=T.Qry(s,(1LL*x*abs(lst)+y)%z));break;//注意1LL,我原本没写就挂成了60分
}return F.clear(),0;
}

【洛谷5335】[THUSC2016] 补退选(指针实现Trie)的更多相关文章

  1. 洛谷P5335 [THUSC2016]补退选 题解

    传送门 一道字典树的例题吧 先说下思路前1,2两个条件都易满足,字典树插入修改即可,第三个条件可用动态数组来实现,存下它的size表示当前有几个节点经过(即人数),其下标表示第几次出现,里面存入操作次 ...

  2. [BZOJ4896][THUSC2016]补退选(Trie)

    4896: [Thu Summer Camp2016]补退选 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 653  Solved: 228[Subm ...

  3. 洛谷P2922 [USACO008DEC] 秘密消息Secret Message [Trie树]

    洛谷传送门,BZOJ传送门 秘密消息Secret Message Description     贝茜正在领导奶牛们逃跑.为了联络,奶牛们互相发送秘密信息.     信息是二进制的,共有M(1≤M≤5 ...

  4. BZOJ 2734 洛谷 3226 [HNOI2012]集合选数【状压DP】【思维题】

    [题解] 思维题,看了别人的博客才会写. 写出这样的矩阵: 1,3,9,... 2,6,18,... 4,12.36,... 8,24,72,... 我们要做的就是从矩阵中选出一些数字,但是不能选相邻 ...

  5. 洛谷$P3226\ [HNOI2012]$集合选数 状压$dp$

    正解:$dp$ 解题报告: 传送门$QwQ$ 考虑列一个横坐标为比值为2的等比数列,纵坐标为比值为3的等比数列的表格.发现每个数要选就等价于它的上下左右不能选. 于是就是个状压$dp$板子了$QwQ$ ...

  6. 洛谷:P1036:选数

    题目描述 已知 nn 个整数 x1,x2,…,xnx1​,x2​,…,xn​ ,以及 11 个整数 kk ( k<nk<n ).从 nn 个整数中任选 kk 个整数相加,可分别得到一系列的 ...

  7. BZOJ4896 THUSC2016补退选(trie)

    字符串扔进trie,vector记录每个前缀出现次数的最大值的更新记录即可. #include<iostream> #include<cstdio> #include<c ...

  8. BZOJ 4896 [Thusc2016]补退选 (Trie树维护vector)

    题目大意:略 这竟然是$thusc$的题... 先把询问里加入的串全拎出来,建出$Trie$树,$Trie$里每个节点都开一个$vector$记录操作标号,再记录操作数量$sum$ 然后瞎**搞搞就行 ...

  9. 洛谷 P2073 送花 treap 无指针

    看了那么多题解都没做对,结果今早上按自己的思路和模板做了做,然后过了. 平衡树裸题 直接上代码: #include<bits/stdc++.h> #define rint register ...

随机推荐

  1. UI_DEV_Environment 之 StoryBook

    写在前面 由于本文主要集中关注与工具使用,所以不可能完全介绍工具的所有功能,所以要想了解更多,可以自己去各自官方网站上查看. github examples 什么是UI开发环境 UI开发环境专注于用户 ...

  2. [转]自定义UiPath Activity实践

    本文转自:https://segmentfault.com/a/1190000017440647 为了对UiPath Activity的实现方式一探究竟,自己尝试实践编写了一个简单的Activity, ...

  3. Ted:1 Vulnhub Walkthrough

    主机层面端口扫描: ╰─ nmap -p1-65535 -sV -A 10.10.202.134 Starting Nmap 7.70 ( https://nmap.org ) at 2019-08- ...

  4. arcgis api for javascript 学习(七) 调用发布地图信息,并将地图属性信息输出到Excel表格---进阶版

    我们在arcgis api for javascript 学习(三)已经学习到了关于调用地图信息进行属性输出的问题,不过通过代码我们实现后会发现还是有一些小瑕疵的,比如我们只能单个数据属性的输出,如果 ...

  5. MYSQL之事务篇

    目录 事务概述 事务隔离级别 Read Uncommitted Read Committed Repeatable Read Serializable 事务概述 在引入事务之前我们先考虑银行转账的操作 ...

  6. redhat 6.5 更换yum源

    新安装了redhat6.5.安装后,登录系统,使用yum update 更新系统.提示: Loaded plugins: product-id, security, subscription-mana ...

  7. [CodeForces - 1225D]Power Products 【数论】 【分解质因数】

    [CodeForces - 1225D]Power Products [数论] [分解质因数] 标签:题解 codeforces题解 数论 题目描述 Time limit 2000 ms Memory ...

  8. vue.js 的 vue-element-admin 实践开发

    官方网址: https://panjiachen.github.io/vue-element-admin-site/zh/ 一:面包屑导航,根目录文字修改: 定位到文件 vue-element-sup ...

  9. Java连载55-Mail编程

    一.电子邮件的历史 1.起源: 1969 Lenoard K. 教授发给同事的“LO” 1971 美国国防部自主的阿帕网(Arpanet)的通讯机制 通讯地址里用@ 1987年中国的第一份电子邮件 “ ...

  10. Redis分布式缓存实现

    基于redis分布式缓存实现 第一:Redis是什么? Redis是基于内存.可持久化的日志型.Key-Value数据库高性能存储系统,并提供多种语言的API. 第二:出现背景 数据结构(Data S ...