P17366 [ECNA 2024] Smart Password Validation

题目描述

人们在输入众多账户之一的密码时经常出错。许多网站要求相当长的密码,这个问题正变得更加严重:密码字符越多,打字出错的机会就越大。 采用“盲打”技术的人,如果某只手没有放在正确的基准键位上,就很容易造成严重错误,因为盲打者输入时不需要看键盘。这会让位置放错的那只手输入的所有字符都“偏一个键”。例如,在 QWERTY 键盘上,如果右手比正常基准位置向左错放一个键,`lion` 可能会变成 `kuib`。 Frobozz Magic Security Company 决定实现一种新的密码验证算法,考虑人们在 QWERTY 风格键盘上输入密码时的一些常见错误,但并非所有可能错误。键盘布局见图 1。 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*`。 允许的错误类型如下: | 名称 | 缩写 | 描述 | 示例 | | :-- | :-: | :-- | :-- | | 左手偏一键 | 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!` | Frobozz Magic Security Company 允许正确按键序列出现表中的某些偏差或偏差组合。LS、RS、EC、MC 中至多允许出现一种;其中任意一种都可以再与 CL 同时出现。也允许没有错误,或只出现 CL。 :::align{center} ![](https://cdn.luogu.com.cn/upload/image_hosting/e8d48a4f.png) :::

输入格式

输入包含多行。第一行是正确密码字符串 $p$,满足 $2\le |p|\le 24$。 第二行包含一个正整数 $n$($1\le n\le 1000$),表示随后待测试密码的数量。 接下来的 $n$ 行中,每行包含一个待测试密码 $t_i$,其长度满足 $|p|-1\le |t_i|\le |p|+1$。 所有密码中的字符,只会来自图示 QWERTY 键盘上能够输入的字符以及小写字母。

输出格式

输出 $n$ 行。对于每个 $t_i$,如果它能够按照 Frobozz 的算法与正确密码 $p$ 匹配,则输出 `YES`;否则输出 `NO`。