动手学自然语言处理
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 512 M,其他语言1024 M
64bit IO Format: %lld

题目描述

一阶马尔可夫模型是一种马尔可夫链,它描述了具有离散状态的随机过程,其中状态的转移仅依赖于前一个状态。即在一阶马尔可夫模型中,当前状态只与前一个状态有关,与更早的状态无关。

在自然语言处理中,一阶马尔可夫模型常用于文本生成任务。以生成句子为例,可以将每个单词看作一个状态,然后根据一阶马尔可夫模型的概率转移,选择下一个单词。通常来讲,每次概率转移所选择的状态都是当前状态下发生概率最大的一个状态(即:下一个单词为最有可能跟在当前单词之后的那一个)。在本题中,如果有多个状态在当前状态下发生的概率相等,则概率转移选择字典序最小的状态。

通过分析大量的文本数据,可以建立单词之间的转移概率,从而生成新的句子。

现在,给定你\,n\,篇文章,每篇文章\,k_i\,个词(词均为小写字母,长度小于10 ,不含任何标点符号),\,m\,次询问,每次询问给出一个单词,请你输出以该单词为第一个词的句子,超过\,21\,个词的部分无需输出。

注意:本题为了简化问题,无需考虑开始符与终止符,不理解的同学不必理会,主要是避免有些nlp大佬多虑。

输入描述:

输入共 n+m+2 行。

第一行输入一个整数 n(1 \le n \le 10^4),表示文章的篇数。

2 \sim n + 1 行共 n 行,每行首先输入一个整数 k_i,表示第 i 篇文章的单词数量, 接下来输入 k_i 个以空格隔开的字符串 s_1,s_2,\dots,s_{k_i},分别表示第 i 篇文章的 k_i 个单词。数据保证k_i \ge 2,\sum_{i=1}^n k_i \le 5 \times 10^4 且所有表示单词的字符串 s 的长度小于 10

n+2 行输入一个整数 m(1 \le m \le 10^4),表示询问的次数。

n + 3 \sim n + m + 2 行共 m 行,每行一个字符串 t_i(1 \le |t_i| \lt 10 ),表示询问的单词。你需要输出以该单词为第一个词的句子,如果输出的单词数量超过了 21,你只需要输出前 21 个单词。

输出描述:

输出共\,m\,行。对于每一次询问,输出一个不超过21个单词的句子,无需输出任何标点符号。
示例1

输入

复制
4
3 i am zwj
3 i love hzau
4 do you love hzau
3 i love nlp
3
i
zwj
scx

输出

复制
i love hzau
zwj
scx

说明

i后面有一个am,两个love,故选择love;love后面有一个nlp,两个hzau,故选择hzau;hzau后面无词,故输出i love hazu。
zwj后没有单词,故仅输出zwj。
scx后没有单词,故仅输出scx。