#1484. [XJTUPC2024] 命令行

内存限制:512 MiB 时间限制:4000 ms 标准输入输出
题目类型:传统 评测方式:文本比较
上传者: hwpvector

题目描述

nn 个两两互不相同的仅由小写字符构成的命令字符串 tit_i (1in1 \leq i \leq n),你需要实现一个支持命令补全的命令行。

你的输入区是一个字符串 ss,他可以接受小写字母 ’a’-’z’\text{'a'-'z'}Tab\text{Tab} 键 (以 ’T’\text{'T'} 表示),Enter\text{Enter} 键 (以 ’E’\text{'E'} 表示),Backspace\text{Backspace} 键 (以 ’B’\text{'B'} 表示)。规则如下所述:

  1. 当你接受小写字符 cc,将把 cc 追加到输入区字符串 ss 的末尾。

  2. 当你接受 Backspace\text{Backspace} 键,将尝试删除最后一个字符:

    • 如果输入区字符串 ss 为空,则不进行任何操作。
    • 如果输入区字符串 ss 非空,则丢弃 ss 末尾的字符。
  3. 当你接受 Tab\text{Tab} 键,将会对 ss 进行一次智能补全,补全规则如下:

    • 设以 ss 为前缀的命令字符串集合为 TT
    • 如果 TT 为空,则不进行任何操作。
    • 如果 TT 非空,则把 ss 置为 lcp(T)\text{lcp}(T)。这里 lcp\text{lcp} 代表最长公共前缀,含义是最长的,是 TT 中每一个字符串前缀的字符串。
  4. 当你接受 Enter\text{Enter} 键,将会试图执行命令 ss:

    • 如果存在命令字符串 ti=st_i = s,则输出命令编号 ii
    • 如果不存在命令字符串 ti=st_i = s,则输出 1-1
    • 无论是否执行成功,清空输入区 ss

给定你接受到的输入串 pp,你需要输出每个 Enter\text{Enter} 键执行的结果。

输入格式

输入第一行为两个整数 nnmm (1n105,1m5×1061 \leq n \leq 10^5, 1 \leq m \leq 5 \times 10^6),为命令字符串的个数和输入串的长度,由空格隔开。

接下来 nn 行,每行一个仅由小写字符构成的字符串 tit_i,为命令串。保证有 i=1nti106\sum_{i=1}^{n} |t_i| \leq 10^6 且命令串互不相同。

最后一行为字符串 pp (p=m|p|=m),为输入串。保证 pp 仅由 {’a’-’z’, ’T’, ’B’, ’E’}\text{\{'a'-'z', 'T', 'B', 'E'\}} 组成。

输出格式

给定你接受到的输入串 pp,你需要输出每个 Enter\text{Enter} 键执行的结果。

样例

样例输入

7 40
kill
killall
rm
rmdir
ifconfig
ifdown
ll
kTBlEkTaTEiTcBdTElTExjtuTExjtuBBBBBrTdTE

样例输出

1 2 6 7 -1 4

数据范围与提示

初始时,输入区字符串 s=s=

输入 ’k’\text{'k'} 后,输入区字符串 s=’k’s=\text{'k'}

输入 ’T’\text{'T'} 后,进行智能匹配。此时 T={’kill’, ’killall’}T=\{\text{'kill', 'killall'}\}lcp(T)=’kill’\text{lcp}(T)=\text{'kill'}。故输入区字符串s=’kill’s=\text{'kill'}

输入 ’B’\text{'B'} 后,输入区字符串 s=’kil’s=\text{'kil'}

输入 ’l’\text{'l'} 后,输入区字符串 s=’kill’s=\text{'kill'}

输入 ’E’\text{'E'} 后,因为 t1=st_1=s,所以应该输出 11