复习一波 $SA$ (后缀数组)
$\Large\mathcal{Description}$
给定一个字符串 $s$。
有 $q$ 次询问,每次询问给定一个字符串 $t$ ,求最小的整数 $k$,满足以下两个条件:
- $0 \leqslant k \leqslant |s| - |t|$
- $s_{[k, k + |t| - 1]}$ 的字典序大于 $t$
数据范围 $:$ $1 \leqslant |s| \leqslant 2 \times 10^5$,$1 \leqslant q \leqslant 5000$,$\sum |t| \leqslant 2 \times 10^5$
$\Large\mathcal{Solution}$
首先,一个字符串的任何子串肯定是该字符串的一个后缀的前缀。
所以,我们对字符串的后缀进行处理。各种数据结构,这里介绍 $SA$ 的做法。
你们肯定都会 $SAM$,幼小的我只会 $SA$
我们熟练地把所有串都连在一起,串与串之间用一些大于字符串中所有字符的奇怪字符隔开。(用 $SA$ 处理多个串的基本套路)
跑一遍 $SA$ 后,我们就得到了 $sa$ 数组(即排名为 $i$ 的后缀的起始位置下标)
然后从大到小枚举后缀即可。
$\Large\mathcal{Code}$
1 |
|