人们在为众多账户输入密码时经常出错。随着许多在线门户网站要求密码越来越长,这个问题变得愈发严重(密码中的字符越多,出现输入错误的可能性就越大)。“盲打”技术的练习者如果其中一只手在打字时没有处于正确的基准键位上,就很容易犯下严重的错误,因为盲打者在打字时不需要看键盘。这可能导致被错位的手所敲击的所有字符都“偏移一个键位”。例如,在 QWERTY 键盘上,如果右手被放置在正常基准位置的左侧一个键位,那么 “lion” 可能会变成 “kuib”。
Frobozz Magic Security 公司决定实施一种新的密码验证算法,该算法考虑了人们在 QWERTY 风格键盘上输入密码时所犯的一些(并非全部)常见错误(见图 M.1)。
图 M.1:QWERTY 键盘
按下 CAPS LOCK 的效果仅限于字母字符,并会切换这些字符的 Shift 键效果。换句话说,当 CAPS LOCK 未启用时,所有字母都以小写形式输入,除非按下其中一个或两个 Shift 键以产生大写字母。当 CAPS LOCK 启用时,情况则相反——除非按下其中一个或两个 Shift 键以产生小写字母,否则默认输入大写字母。算法设计者假设在输入密码的过程中,CAPS LOCK 键的状态不会发生改变。
他们的算法会寻找与正确按键序列的偏差。例如,如果正确密码是 “ALg”,使用上述键盘的正确序列是 “SHIFT-A, SHIFT-L, G, SHIFT-8”。如果用户在输入密码前不小心按下了 CAPS LOCK 键,但随后使用了正确的按键序列,他们最终会输入 “alG”。同样,如果一位盲打者不小心将左手手指放在了正确位置右侧一个空格的位置,没有犯其他错误,并试图遵循正确的序列(未意识到手指位置的偏移),他们会输入 “SLh”。如果在此基础上,他们还在输入密码前不小心激活了 CAPS LOCK 键,他们会输入 “slH”。最后,用户可能会不小心插入或删除一个字符。例如,密码 “ALg” 可能会被误输为 “AL” 或 “ALLg*”。
Frobozz Magic Security 公司决定允许某些偏差,或偏差的组合,如表 M.2 所述。最多允许出现 LS、RS、EC 和 MC 错误中的一种,但任何这些错误都可能与 CL 错误同时发生。
图 M.2:允许的错误类型
| 名称 | 缩写 | 描述 | 样例 |
|---|---|---|---|
| 左侧偏移一个键位 | LS | 键盘左侧的所有字符向右移动一个键位。向右移动一个键位的左 Shift 键仍然是左 Shift 键。 | FlatHead $\Rightarrow$ GlsyHrsf |
| 右侧偏移一个键位 | RS | 键盘右侧的所有字符向左移动一个键位。向左移动一个键位的右 Shift 键仍然是右 Shift 键。 | FlatHead $\Rightarrow$ FkatGead |
| 单个多余字符 | EC | 输入的密码多了一个字符 | Zorkmid $\Rightarrow$ Zorkmiid (多了一个 i) |
| 单个缺失字符 | MC | 输入的密码少了一个字符 | FCD#3 $\Rightarrow$ FCD3 (少了 #) |
| 误开启 CAPS LOCK | CL | 所有小写字母显示为大写,所有大写字母显示为小写 | WE do it! $\Rightarrow$ we DO IT! |
输入格式
输入包含多行。第一行包含一个字符串 $p$,即正确密码 ($2 \le \text{length}(p) \le 24$)。第二行包含一个正整数 $n$ ($1 \le n \le 1000$),表示后续的行数。接下来的 $n$ 行,每行包含一个待测试的密码 $t_i$ ($\text{length}(p) - 1 \le \text{length}(t_i) \le \text{length}(p) + 1$)。所有密码的字符仅来自上述 QWERTY 键盘图片中出现的字符,以及小写字母。
输出格式
输出包含 $n$ 行。对于每个 $t_i$,如果 $t_i$ 使用 Frobozz 的算法与密码 $p$ 匹配,则该行应包含单词 YES,如果不匹配,则为 NO。
样例
输入格式 1
Password=‘A:’ 9 Password=‘A:’ pASSWORD=‘a:’ Psddeotf=1S:’ oASSWIRD-‘al; Password=‘A:’x pASWORD=‘a:’ pASSWORD=‘a:’X Osddeitf-1SL; Psdeotf=1S:’
输出格式 1
YES YES YES YES YES YES YES NO NO