题目 30222

Aho-Corasick 自动机

查看题解 ↗GitHub ↗如何评测
题号
30222
时间限制
10000 ms
内存限制
1024 MB
标签
字符串字典树
来源
Library Checker (yosupo06) - aho_corasick

【题目描述】

给定字符串 S0,…,SN−1S_0, \dots, S_{N-1},每个字符串都由小写英文字母组成。请按下面的描述输出由这些字符串构建出的 Trie 的信息。

  • 记 Pi,jP_{i,j} 为 SiS_i 的长度为 jj 的前缀(其中 0≤j≤∣Si∣0 \leq j \leq |S_i|)。
  • 定义集合 PP 为 P={Pi,j∣0≤i<N,0≤j≤∣Si∣}P=\lbrace P_{i,j}\mid 0\leq i<N, 0\leq j\leq |S_i|\rbrace。设 n=∣P∣n = |P|。
  • (S0,…,SN−1)(S_0, \dots, S_{N-1}) 的 Trie 是一棵包含 nn 个顶点的树,顶点与 PP 中的元素一一对应。 Trie 中的每个顶点 vv 对应某个 str(v)∈P\mathrm{str}(v) \in P。
    • 当选定的 (i,j)(i, j) 满足 str(v)=Pi,j\mathrm{str}(v) = P_{i,j} 时,按 (i,j)(i, j) 的字典序为各顶点分配编号 0,1,…,n−10, 1, \dots, n-1,其中 ii 取最小。特别地,str(0)\mathrm{str}(0) 为空串。
  • 对每个顶点 vv(1≤v<n1 \leq v < n),记 pvp_v 为其父亲顶点的编号。也就是说,pvp_v 是删去 str(v)\mathrm{str}(v) 的最后一个字符后所得字符串对应的顶点的编号。
  • 对每个顶点 vv(1≤v≤n1 \leq v \leq n),记 svs_v 为失配指针(suffix link)指向的顶点编号。也就是说,svs_v 是 str(v)\mathrm{str}(v) 的属于 PP 且比 str(v)\mathrm{str}(v) 短的后缀中最长者的顶点编号。

请输出 nn 的值,并对每个顶点 vv(1≤v<n1 \leq v < n)输出 pvp_v 和 svs_v。此外,对每个 i=0,1,…,N−1i = 0, 1, \dots, N-1,输出 SiS_i 所对应的顶点的编号。

【输入】

文本
$N$
$S_0$
$\vdots$
$S_{N-1}$

【输出】

文本
$n$
$p_1$ $s_1$
$\vdots$
$p_{n-1}$ $s_{n-1}$
$v_0$ $\ldots$ $v_{N-1}$

【输入样例】

文本
4
b
a
c
a

【输出样例】

文本
4
0 0
0 0
0 0
1 2 3 2

【输入样例2】

文本
3
b
a
ab

【输出样例2】

文本
4
0 0
0 0
2 1
1 2 3

【输入样例3】

文本
1
abcabcaba

【输出样例3】

文本
10
0 0
1 0
2 0
3 1
4 2
5 3
6 4
7 5
8 1
9

【输入样例4】

文本
5
aaa
a
aa
aaaaa
a

【输出样例4】

文本
6
0 0
1 1
2 2
3 3
4 4
3 1 2 5 1

【数据范围】

  • 1≤N≤10000001 \leq N \leq 1000000
  • 1≤∣Si∣≤10000001 \leq |S_i| \leq 1000000
  • 1≤∑0≤i<N∣Si∣≤10000001 \leq \sum_{0\leq i<N}|S_i| \leq 1000000
  • SS 的每个字符均为小写英文字母。

【来源】

Library Checker(yosupo06) aho_corasick

数据下载

题目 30222 的公开数据

正在读取文件列表…

常用命令

题目 30222 的 ROJ 命令

以下命令默认使用全局安装的 ROJ Skill,请在终端中直接执行;如果修改过 AGENT_HOME,请将命令中的 ~/.agents 替换为对应目录。