2026.3.27 NOI 模拟赛 题解

比赛

(应题库要求不写题目描述)

T1 NFLS #P13193. 病毒题

容易转化为一个字符串,每次末尾加入或删除,维护其本质不同的子串数量和本质不同的子串总长

直接的想法为模仿 \(\text{SA}\),维护其逆序串的所有后缀(即原串的所有前缀)的顺序,则以上两项转化为相邻后缀的 \(\text{lcp}\) 之和与平方和(严格而言为择 \(2\) 和,但实际等价)

用平衡树维护之(std::set 即可),比较时二分加哈希

容易做到 \(O(n\log^2 n)\)

加入两个优化即可通过(包括加强后):

  1. 使用倍增而不是二分,这样一次的复杂度为 \(O(\text{lcp})\) 而不是 \(O(n)\) 的,在绝大多数情况下都较快(因为 \(\text{lcp}\) 很大的情况很小)
  2. 当整个串几乎相同时理论上倍增常数是二分的两倍左右,此时特判一下即可(对于前缀 \(a\) 和前缀 \(b\),判断两者长度为 \(\min(a,b)\) 的后缀是否相同),这样对于特殊数据有极大性能提升

代码

\(O(n\log n)\) 做法:

离线,建立操作树,则每次需要比较两个结点到根的链上从下往上组成的字符串的字典序

树上倍增的方式进行倍增 \(\text{SA}\),求出所有串的顺序即可

T2 NFLS #P13211. 木棍

用类似 P6936 [ICPC 2017 WF] Scenery 的技巧可以转化为差分约束

离散化后 \(O(n+m)\) 点,\(O((n+m)^2+k)\) 条边

使用 \(\text{SPFA}\),加入一定优化,配合卡时可过

时间复杂度 \(O((n+m)((n+m)^2+k))\)

代码

\(O(n^2\log n)\) 的算法:令 \(ds_{i,j}\) 表示走 \(i\) 步到 \(j\) 的最短路,则 \(ds_i\to ds_{i+1}\) 可以线段树优化

参考

T3 NFLS #P13148. 序列删除游戏

比赛结果

\(100+100+30\)\(\text{rk}2\),数据加强后为 \(88+100+30\)

posted @ 2026-03-28 07:31  Hstry  阅读(0)  评论(0)    收藏  举报