#P17476. [ICPC 2018 Jiaozuo R] Counting Failures on a Trie
[ICPC 2018 Jiaozuo R] Counting Failures on a Trie
题目描述
在计算机科学中,trie,又称前缀树,是一种搜索树,一种有序的树形数据结构,其键通常为字符串。
这里我们有一棵包含 个节点的 trie,节点编号为 到 ,其根为编号 的节点。trie 中的所有边均从高度较低的节点指向高度较高的节点。每条边仅包含一个小写字母,且从同一节点出发的任意两条边所具有的字符互不相同。
我们希望在 trie 上为任意字符串 引入一种特殊的匹配过程。
匹配将从根开始,按顺序依次考虑所有字符 ,并沿着某条从当前节点出发且包含当前所考虑字符的边移动。如果匹配到达某个节点后无法沿任何边继续移动,则:
- 它将在当前字符处记录一次失败,跳过该字符并移回根节点;
- 随后它将在下一次匹配步中考虑下一个字符,因为失败的字符应当被跳过。
最终,在考虑完 中的所有字符后,匹配将停留在 trie 的某个节点上,该节点指示了此次匹配的目的地。我们将目的地的编号记作 ,并将匹配过程中失败的总次数记作 。 现在,我们给你一个长度为 的全小写字母字符串 ,你需要回答 个查询。一个查询定义为
$$\displaystyle Query(l, r) = (CFail(S[l..r]), Dest(S[l..r])),$$即询问 的子串 所对应的匹配失败总次数及目的地。
输入格式
输入包含多组测试数据,第一行包含一个正整数 ,表示测试数据组数,最多为 。
对于每组测试数据,第一行包含三个整数 、 和 ,分别表示 trie 的节点数、给定字符串 的长度以及查询的总数,满足 。
接下来的 行描述 trie。其中第 行包含一个整数 (满足 )和一个小写字母 ,分别表示第 个节点的父节点以及连接它们的边上的字符。
再接下来一行包含一个全小写字母的字符串,表示给定的长度为 的字符串 。
最后 行中的每一行包含两个整数 和 ,表示一个查询 ,满足 。
我们保证所有测试数据中 的总和、 的总和以及 的总和均分别不超过 。
输出格式
对于每组测试数据,输出若干行以回答所有查询。
对于每个查询,输出一行包含两个整数,分别表示 和 。你应在两个数字之间恰好输出一个空格。
1
5 10 5
0 a
0 b
1 a
1 c
2 a
aaacbaacab
1 5
1 6
1 7
3 9
4 10
2 2
2 5
3 0
2 1
4 0
提示
下图展示了样例测试数据中给出的 trie。
:::align{center}
:::
所有查询的路径描述如下,其中每个 表示一次失败。
- $Path(1, 5) = Path(\text{``aaacb"}) = 0 \longrightarrow 1 \longrightarrow 3 \Longrightarrow 0 \Longrightarrow 0 \longrightarrow 2;$
- $Path(1, 6) = Path(\text{``aaacba"}) = 0 \longrightarrow 1 \longrightarrow 3 \Longrightarrow 0 \Longrightarrow 0 \longrightarrow 2 \longrightarrow 5;$
- $Path(1, 7) = Path(\text{``aaacbaa"}) = 0 \longrightarrow 1 \longrightarrow 3 \Longrightarrow 0 \Longrightarrow 0 \longrightarrow 2 \longrightarrow 5 \Longrightarrow 0;$
- $Path(3, 9) = Path(\text{``acbaaca"}) = 0 \longrightarrow 1 \longrightarrow 4 \Longrightarrow 0 \longrightarrow 1 \longrightarrow 3 \Longrightarrow 0 \longrightarrow 1;$
- $Path(4, 10) = Path(\text{``cbaacab"}) = 0 \Longrightarrow 0 \longrightarrow 2 \longrightarrow 5 \Longrightarrow 0 \Longrightarrow 0 \longrightarrow 1 \Longrightarrow 0.$
翻译由 DeepSeek V4 Pro 完成