由于每个 token 的长度不超过 12,可以不建复杂结构,直接使用哈希表存储 token 到 id 的映射。
从文本 s 的当前位置 i 开始,按照长度从大到小尝试匹配:
从 min(12,M−i) 开始,依次尝试长度 len 的子串,如果该子串存在于哈希表中,就说明找到了当前位置能匹配的最长 token。
找到后输出对应 id,并让 i 向后移动 len 位,继续处理后面的文本。
给定一个从字符串到整数编号(token−id)的映射表,再给定一段由小写字母组成的文本。请把文本从左到右切分成若干个token:在当前位置,总是贪心地匹配能匹配到的最长 token,输出它的编号,然后从该token之后继续;如此重复,直到文本结束。
保证文本中出现的每个字符本身都是映射表中的一个 token(即所有必要的长度为1 的token都存在),因此在任意位置贪心匹配总能成功,切分一定能覆盖整段文本。
第一行包含一个整数n(1≤n≤3×104),表示映射表中 token的数量。
接下来n 行,每行包含一个 token字符串t 和一个整数编号id(0≤id≤109) ,中间用一个空格分隔。t 由小写字母组成,长度不超过12 ,不同 token 互不相同。
最后一行为待切分的文本s ,由小写字母组成,长度为M(1≤M≤105)。
输出切分得到的 token 编号序列,用单个空格分隔,占一行。
输入
5
a 1
ab 2
abc 3
b 4
c 5
abcab
输出
3 2
说明
从位置0 开始,能匹配的最长 token 是 abc,输出编号3 ,前进到位置3 ;剩下的 ab 最长匹配是 ab,输出编号2 。
输入
11
he 10
hell 11
hello 12
h 1
e 2
l 3
o 4
world 20
w 5
r 6
d 7
hellow
输出
12 5
说明
位置0 处 he、hell、hello 都能匹配,贪心取最长的 hello,输出12 ;剩下的 w 只能匹配单字符 token w,输出5 。
本题属于以下题库,请选择所需题库进行购买
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册