P12923 [POI 2021/2022 R3] 模板 2 / Szablon 2

P12923 [POI 2021/2022 R3] 模板 2 / Szablon 2

https://www.luogu.com.cn/problem/P12923

上来先考虑对于一个 \(l\) 怎么做。

首先用 ExKMP 求出 \(s[i:n]\)\(s\) 的 LCP \(f_i\)\(s[1:i]\)\({\rm rev}(s)\) 的 LCS \(g_i\)。只保留 \(f_i,g_i\ge l\)\(f_i,g_i\),然后对每一个点判断是否被覆盖即可。

这样不太好扩展到多个 \(l\) 的情况,维护起来太困难了。

暴力一点,从头开始匹配,每次尽量向远处跳。 每两次跳的距离一定 \(\ge l\),否则可以省掉中间一步。所以 跳的总次数为 \(O(n\log n)\)

从小到大枚举 \(l\),每次会删除几个关键点,用序列并查集维护每个位置前面第一个关键点。复杂度 \(O(n\log n\alpha(n))\)

可以用线性序列并查集:给每个位置设个状态,\(1\) 表示没有和前面合并,\(0\) 表示合并了,每次查询相当于查询前面第一个 \(1\)。取 \(w=64\),每 \(w\) 个分一块,这个块变为全 \(0\) 就把这个块的 \(fa\) 设为前面的。

需要同时写按秩合并和路径压缩。单次操作复杂度 \(O(\alpha(m,n/w))\),当 \(w>\log n\land m>n\) 时,\(\alpha(m,n/w)\) 为常数,所以单次操作复杂度 \(O(1)\)

https://www.luogu.com.cn/record/258818683

posted @ 2026-01-24 17:15  XP3301_Pipi  阅读(27)  评论(0)    收藏  举报
Title