#abc452c. Fishbones

Fishbones

题目描述

高砂是一位艺术家,他制作了一个鱼骨形状的装置。

该装置包含 1 条脊椎骨NN 根肋骨(编号为 11NN)。
他希望在每根骨头(共 N+1N+1 根)上分别写一个字符串,满足以下所有条件:

  1. 写在脊椎骨上的字符串长度恰好为 NN
  2. 对于每根肋骨 ii1iN1 \le i \le N):
    • 写在肋骨 ii 上的字符串长度为 AiA_i
    • 该字符串的第 BiB_i 个字符 等于 脊椎骨字符串的第 ii 个字符。
  3. 所有写在骨头上的字符串都必须来自给定的字符串集合 {S1,S2,,SM}\{S_1, S_2, \dots, S_M\}(允许重复使用)。

现在,对于每个 j=1,2,,Mj = 1, 2, \dots, M,请判断:

是否存在一种合法的书写方案,使得脊椎骨上写的字符串恰好是 SjS_j


输入格式

输入从标准输入按如下格式给出:

N
A₁ B₁
A₂ B₂
⋮
A_N B_N
M
S₁
S₂
⋮
S_M

其中:

  • 第一行是一个整数 NN
  • 接下来 NN 行,每行两个整数 AiA_iBiB_i
  • 然后是一个整数 MM
  • 接下来 MM 行,每行一个字符串 SjS_j

输出格式

输出 MM 行。
jj 行输出:

  • Yes:如果存在一种合法方案,使得脊椎骨上的字符串为 SjS_j
  • No:否则。

样例输入 #1

5
5 3
5 2
4 1
5 1
3 2
8
retro
chris
itchy
tuna
crab
rock
cod
ash

样例输出 #1

Yes
Yes
No
No
No
No
No
No

样例说明 1

通过在肋骨 1,2,3,4,51,2,3,4,5 上分别写入 chris, retro, tuna, retro, cod,可以满足所有条件,且脊椎骨上为 retro

  • retro 的长度为 55
  • 每根肋骨验证如下:
    • 肋骨 1:chris(长度 5),第 3 个字符是 'r',等于 retro 的第 1 个字符;
    • 肋骨 2:retro(长度 5),第 2 个字符是 'e',等于 retro 的第 2 个字符;
    • 肋骨 3:tuna(长度 4),第 1 个字符是 't',等于 retro 的第 3 个字符;
    • 肋骨 4:retro(长度 5),第 1 个字符是 'r',等于 retro 的第 4 个字符;
    • 肋骨 5:cod(长度 3),第 2 个字符是 'o',等于 retro 的第 5 个字符。

类似地,若脊椎骨为 chris,也可找到合法分配(如肋骨写 itchy, chris, rock, itchy, ash):


样例输入 #2

5
5 1
5 2
5 3
5 4
5 5
8
retro
chris
itchy
tuna
crab
rock
cod
ash

样例输出 #2

Yes
Yes
Yes
No
No
No
No
No

数据范围

  • 1N101 \le N \le 10
  • 1BiAi101 \le B_i \le A_i \le 10
  • 1M2000001 \le M \le 200\,000
  • 每个 SjS_j 是仅由小写英文字母组成的字符串;
  • 1Sj101 \le |S_j| \le 10
  • 所有 SjS_j 互不相同。

提示

  • 对每个候选脊椎字符串 SjS_j,先检查其长度是否为 NN。若不是,直接输出 No
  • 若长度正确,则对每根肋骨 ii,检查是否存在某个 SkS_k 满足:
    • Sk=Ai|S_k| = A_i
    • Sk[Bi1]=Sj[i1]S_k[B_i - 1] = S_j[i - 1](注意下标从 0 开始)
  • 可预先按长度字符位置建立索引,加速查询(因 MM 较大,但字符串长度 ≤10,可行)。