牛客多校第二场 F 题题解

NIO with String Game

https://ac.nowcoder.com/acm/contest/33187/F

F NIO with String Game

F 题题意:给定 nn 个串 {Tn}\{T_n\} 和一个串 SS,有以下四种操作:

  1. TxT_x 的末尾增加一个字符;
  2. SS 串末尾删除 pp 个字符;
  3. SS 串末尾插入 kk 个字符;
  4. 查询 {Tn}\{T_n\} 中有多少个字符串字典序严格小于 SS

qq 次操作,n,q5×105n,q \leq 5\times 10^5,字符串总长小于等于 2×1052\times 10^5。 解法:根据 {Tn}\{T_n\} 离线建立 Trie,加入最终情况的 {Tn}\{T_n\},然后将 Trie 树欧拉序化,上建立 BIT,只在 TT 串末尾对应节点标 11 表示一次出现。但是初始情况下打上末尾标记的是初始的 {Tn}\{T_n\},随着不断加入字符会将这一标记不断移动。

维护一个栈来记录 SS,相同字符压缩存储。同时 Trie 上进行树上倍增,记录从当前节点开始沿 chch 字符走 2k2^k 次所能到的节点。查询操作的时候,对于严格小的串,其欧拉序一定严格在当前节点前面。对于恰好在当前节点的,比较栈中长度和 Trie 树上节点对应的 TT 串长度,相同就不计入。

一些细节:如果当前节点无对应字符出边,则倍增的时候就认为它沿这一字符出边还是走到它自己。此时为了统计 SS 真实情况下已经失配但是还在 Trie 树上的情况,记录一个 SS 串真实长度,对于子树下小于当前 SS 的失配字符 chch 的字符出边,统计下对应的子树大小。

总复杂度 O(n+q)logn\mathcal O(n+q) \log n

全部评论

相关推荐

04-17 20:54
已编辑
湖南大学 Java
自我感觉答得不好,估计是挂了。但面试官人很好,氛围相对轻松。流程:常规自我介绍,20min项目,10min八股,30min算法,反问。项目:问了一些技术细节,以及改进方向。八股:1、http的默认端口号?(80)2、linux中查看进程监听端口号的命令?(不熟悉linux,答了个netstat -ntlp)3、UDP传输如何解决乱序问题?(没答上来,有个在包中添加序列号,但是忘记了)4、某个端口已经监听了UDP,是否能再监听TCP?(没答上来,答案是可以,面试官说这题很偏,不知道也正常)5、malloc分配的是栈内存还是堆内存?(堆)6、进程和线程的区别?(我答的进程是资源分配的最小单位,线程...
丰川打工祥:T8我觉得应该是:静态内部类是外部类的静态成员,独立于外部类的实例,而非静态内部类依赖于外部类的实例,可以访问外部类的所有成员。比如A是外部类,B是静态内部类,C是A的普通内部类。由于 B 是静态内部类,它属于外部类 A 的静态成员,因此可以直接通过 A.B 来创建静态内部类的实例,不需要先创建 A 的实例。而 C 是非静态内部类,它需要依赖外部类 A 的实例,因此必须先创建 A 的实例,然后才能通过这个实例来创建 C 的对象。所以,不能直接用 A.C 来创建 C 的实例。
腾讯一面1768人在聊 查看14道真题和解析
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务