#P11877. KMP 的馈赠

KMP 的馈赠

题目描述

小威正在学习字符串相关的内容,今天,他开始学习 KMP 算法。

正好,小海精通 KMP 算法,向小威讲述了算法流程,并向小威提出了一个问题:

小海给了小威一个长度为 nn 的字符串 ss,定义一个前缀 s1:is_{1:i} 的价值

vi=ilen(border(s1:i))v_i = i \oplus \operatorname{len}(\operatorname{border}(s_{1:i}))

其中:

  • \oplus 表示按位异或;
  • border(s)\operatorname{border}(s) 表示 ss 中最长的前缀与后缀相同的子串,例如:border(abcda)=a\operatorname{border}(abcda) = aborder(aaa)=aa\operatorname{border}(aaa) = aa
  • len(s)\operatorname{len}(s) 表示 ss 的长度。

特别地,定义空串的价值 v0=0v_0 = 0

小海告诉小威,如果要在 ss 中选择一个前缀 tt,那同时要选择前缀 border(t)\operatorname{border}(t),例如,如果小威选择了 aaaaaa,那么小威需要同时选择 aa,a,εaa, a, \varepsilon,其中 ε\varepsilon 表示空串。如此,小威选择了 {aaa,aa,a,ε}\{aaa, aa, a, \varepsilon\}44 个前缀。称这为一个前缀集合,前缀集合的价值为集合中所有前缀的价值之和。

对于一个字符串 xx 的前缀集合 uu,和另一个字符串 yy 的前缀集合 vv,设把它们合并后的前缀集合为 {uv}{uv}{g(x,y)}\{u \cup v\} \setminus \{u \cap v\} \cup \{g(x, y)\}。其中 g(x,y)g(x, y) 表示 xxyy 的最长公共 border。特别地,若 xx 属于 yy 的 前缀集合,则 g(x,y)=xg(x,y) = x

例如,uuaaaaaa 的前缀集合,vvabaaba 的前缀集合,则合并后为

{ε,a,aa,aaa,aba}{ε,a}{a}={a,aa,aaa,aba}\{\varepsilon, a, aa, aaa, aba\} \setminus \{\varepsilon, a\} \cup \{a\} = \{a, aa, aaa, aba\}

小海会问小威 mm 次,是否存在两个不同的前缀集合 uuvv,使得合并 uuvv 后的价值之和为 kk

输入格式

第一行两个整数 n,mn, m,含义如上所述。

第二行一个长度为 nn 的字符串 ss,含义如上所述。

接下来 mm 行,每行一个整数 kk,含义如上所述。

对于所有数据,满足:1n3×1041 \leq n\leq 3 \times 10^41m5001 \leq m \leq 5000k1070 \leq k \leq 10^7ss 中仅包含小写英文字符。

输出格式

对于每次询问,输出一个字符串代表答案。如果存在输出 Yes,否则输出 No

输入数据 1

5 4
abcab
0
15
10
18

输出数据 1

No
Yes
Yes
No

输入数据 2

10 8
wlwlwlwlwl
0
14
1
9
6
2
2
14

输出数据 2

No
No
Yes
Yes
No
Yes
Yes
No