背景
时光荏苒,那个关于“谐音替换”的下午,依旧清晰地印在小 ω 的脑海里。
那时的他,执着于精确的匹配:必须完全相同的子串,才能进行替换。然而,现实往往不尽如人意,细微的差别就足以让一切努力付诸东流。
多年以后,当小 ω 再次翻开语言学笔记,他对“谐音”有了新的理解:何必苛求完全一致?只需拥有相同的前后,便已足够谐音。就像回忆中的点滴,不必完整重现,只需一个开头或一个结尾,便能串联起整个故事。
题目描述
小 ω 是一名喜欢语言学的算法竞赛选手。在语言学中,谐音替换是指将原有的字词替换为读音相同或相近的字词。小 ω 发现,谐音替换的过程可以用字符串的前缀或后缀关系来进行描述。具体地,小 ω 将谐音替换定义为以下字符串问题:
- 字符串 X 是 Y 的谐音替换,当且仅当 X 是 Y 的前缀,或 X 是 Y 的后缀。
- 记语言集合为 S={S1,S2,…,Sn}。字符串 T 的一个谐音三元组是指将 T 分成三个非空的连续段 T=A+B+C(其中 + 表示字符串拼接),使得每一段 A,B,C 均是 S 中的某个字符串的谐音替换,每一种划分方案对应一个字符串三元组 (A,B,C),我们称这个三元组为字符串 T 的一个谐音三元组。
两个谐音三元组 (A1,B1,C1) 和 (A2,B2,C2) 本质不同,当且仅当 A1=A2 或 B1=B2 或 C1=C2。
现在给出 n 个字符串 S1,S2,…,Sn 作为语言集合,再给出 m 个字符串 T1,T2,…,Tm 作为待分析的语言资料。
请对于每个 Ti,帮助小 ω 求出有多少种本质不同的谐音三元组方案。
输入格式
第一行包含两个整数 n 和 m(1≤n,m≤105)。
接下来 n 行,每行一个字符串 Si,表示语言集合中的单词。
接下来 m 行,每行一个字符串 Ti,表示待分析的资料。
输出格式
输出 m 行,其中第 j(1≤j≤m)行包含一个非负整数,表示 Tj 有多少种本质不同的谐音三元组。
1 1
abbcabb
abbcabbcabb
12
提示
【样例1解释】
12 种本质不同的谐音三元组如下:
- (a,bbcabb,cabb)
- (ab,bcabb,cabb)
- (abb,cabb,cabb)
- (abbc,a,bbcabb)
- (abbc,ab,bcabb)
- (abbc,abb,cabb)
- (abbc,abbc,abb)
- (abbc,abbca,bb)
- (abbc,abbcab,b)
- (abbca,b,bcabb)
- (abbca,bb,cabb)
- (abbcab,b,cabb)
【数据范围】
设 ∣X∣ 为字符串 X 的长度,L1=i=1∑n∣Si∣,L2=i=1∑m∣Ti∣。对于所有测试数据,保证:
- 1≤n,m≤105;
- 1≤∣Si∣,3≤∣Ti∣;
- 1≤L1≤5×105,3≤L2≤3×105;
- 对于所有 1≤i≤n,Si 均仅包含大小写英文字母。
- 对于所有 1≤i≤m,Ti 均仅包含大小写英文字母。
| 测试点编号 |
n,m≤ |
L1 |
L2≤ |
特殊性质 |
| 1,2 |
100 |
200 |
无 |
| 3∼5 |
103 |
2000 |
^ |
| 6 |
^ |
105 |
A、B |
| 7,8 |
104 |
^ |
A |
| 9,10 |
105 |
B |
| 11,12 |
^ |
2×105 |
无 |
| 13,14 |
5×105 |
3×105 |
A |
| 15,16 |
^ |
B |
| 17∼20 |
无 |
特殊性质 A:m=1。
特殊性质 B:对于所有 1≤i≤n,Si 均以 z 结尾。对于所有 1≤i≤m,Ti 均不包含 z。