字符串专题1

A.CF547E Mike and Friends

多校考过,当时拿根号过的

建立 \(AC\) 自动机,询问转成差分形式,每次把一个字符串的所有前缀位置都 \(+1\), 询问某个点子树内总和

树状数组即可

用广义 \(SAM\) + 线段树合并也可以无脑过

B. Misha and LCP on Tree

匹配两个串好像除了 \(Hash\) 也没啥太好的办法

树剖,每次把字符串的区间按顺序取出,维护正反 \(Hash\) 进行比较即可

C.CF204E Little Elephant and Strings

省选互测5,T2

广义SAM+set维护在哪些串中出现过,然后每个串匹配查询即可

D. AB-Strings

相同的压缩处理,尽量一次操作消去两对,于是分讨开头是否相同,尽量让两串长度相近

E. String Problem

考虑已知 \(i\) 的,求 \(i + 1\) 的答案

首先答案一定是 \(i\) 答案或其 \(border\) 加上新字符构成,自证不难

暴跳 \(border\), 如果更优则一直跳,否则不跳

不跳是因为随着长度减小,后面的字母一定不增

否则之前就会把较长的替代

F.Suffix Automaton

首先容易定长,然后在后缀树上 \(DFS\) 序就是字典序,每个节点对应的长度都是一个区间,下来扫描线+线段树求第 \(K\) 个位置

G. Substrings in a String

分块,每 \(B\) 个处理一个后缀自动机/KMP啥的,修改暴力重构

对询问进行阈值分治, \(>= B\) 的直接做后缀自动机/KMP \(\frac{n^2}{B}\)

考虑 \(< B\) 的,每个块暴力查询 \(\frac{n^2}{B}\),块之间暴力查询 \(nB\)

复杂度 \(\frac{n^2}{B} + nB\)

但是,,,,,,,,,,

\(bitset\) 可以爆标 \(\frac{n^2}{\omega}\)

H.CF700E Cool Slogans

省选互测3,T1

\(s_{i - 1}\)\(s_{i}\) 的后缀一定不劣,考虑在 \(parent\) 树上 \(DP\)

考虑 \(x\) 的祖先 \(y\),如果 \(y\)\(x\) 中出现两次,只需要判断 \([pos(x) - len(x) + len(y), pos(x) - 1]\) 中是否存在 \(y\) 即可

使用线段树合并即可快速查询

由于我们只关心\(parent\) 树上父子节点的关系,所以都取到 \(len\) 是可以的

\(k\) 相同时,我们希望子串越短越好,所以记录每个答案对应的深度最浅的点,这样每次转移只需要判断一次即可

posted @ 2023-05-19 10:42  Chen_jr  阅读(24)  评论(0编辑  收藏  举报