luogu#P10526. [XJTUPC2024] 命令行

[XJTUPC2024] 命令行

题目描述

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="k"

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

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

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

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