P17476 [ICPC 2018 Jiaozuo R] Counting Failures on a Trie

题目描述

在计算机科学中,trie,又称前缀树,是一种搜索树,一种有序的树形数据结构,其键通常为字符串。 这里我们有一棵包含 $(n + 1)$ 个节点的 trie,节点编号为 $0$ 到 $n$,其根为编号 $0$ 的节点。trie 中的所有边均从高度较低的节点指向高度较高的节点。每条边仅包含一个小写字母,且从同一节点出发的任意两条边所具有的字符互不相同。 我们希望在 trie 上为任意字符串 $T[1..k]$ 引入一种特殊的匹配过程。 匹配将从根开始,按顺序依次考虑所有字符 $T[1], T[2], \cdots, T[k]$,并沿着某条从当前节点出发且包含当前所考虑字符的边移动。如果匹配到达某个节点后无法沿任何边继续移动,则: * 它将在当前字符处记录一次失败,跳过该字符并移回根节点; * 随后它将在下一次匹配步中考虑下一个字符,因为**失败的字符应当被跳过**。 最终,在考虑完 $T$ 中的所有字符后,匹配将停留在 trie 的某个节点上,该节点指示了此次匹配的目的地。我们将目的地的编号记作 $Dest(T)$,并将匹配过程中失败的总次数记作 $CFail(T)$。 现在,我们给你一个长度为 $m$ 的全小写字母字符串 $S[1..m]$,你需要回答 $q$ 个查询。一个查询定义为 $$\displaystyle Query(l, r) = (CFail(S[l..r]), Dest(S[l..r])),$$ 即询问 $S$ 的子串 $S[l..r]$ 所对应的匹配失败总次数及目的地。

输入格式

输入包含多组测试数据,第一行包含一个正整数 $T$,表示测试数据组数,最多为 $1000$。 对于每组测试数据,第一行包含三个整数 $n$、$m$ 和 $q$,分别表示 trie 的节点数、给定字符串 $S$ 的长度以及查询的总数,满足 $1 \leq n, m, q \leq 10^5$。 接下来的 $n$ 行描述 trie。其中第 $i$ 行包含一个整数 $f_i$(满足 $0 \leq f_i < i$)和一个小写字母 $c_i$,分别表示第 $i$ 个节点的父节点以及连接它们的边上的字符。 再接下来一行包含一个全小写字母的字符串,表示给定的长度为 $m$ 的字符串 $S$。 最后 $q$ 行中的每一行包含两个整数 $l$ 和 $r$,表示一个查询 $Query(l, r)$,满足 $1 \leq l \leq r \leq m$。 我们保证所有测试数据中 $n$ 的总和、$m$ 的总和以及 $q$ 的总和均分别不超过 $10^6$。

输出格式

对于每组测试数据,输出若干行以回答所有查询。 对于每个查询,输出一行包含两个整数,分别表示 $CFail(S[l..r])$ 和 $Dest(S[l..r])$。你应在两个数字之间恰好输出一个空格。

说明/提示

下图展示了样例测试数据中给出的 trie。 :::align{center} ![](https://cdn.luogu.com.cn/upload/image_hosting/jyaqjbo8.png) ::: 所有查询的路径描述如下,其中每个 $\Longrightarrow$ 表示一次失败。 * $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 完成