#P17366. [ECNA 2024] Smart Password Validation

[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} :::

输入格式

输入包含多行。第一行是正确密码字符串 pp,满足 2≤∣p∣≤242\le |p|\le 24。

第二行包含一个正整数 nn(1≤n≤10001\le n\le 1000),表示随后待测试密码的数量。

接下来的 nn 行中,每行包含一个待测试密码 tit_i,其长度满足 ∣p∣−1≤∣ti∣≤∣p∣+1|p|-1\le |t_i|\le |p|+1。

所有密码中的字符,只会来自图示 QWERTY 键盘上能够输入的字符以及小写字母。

输出格式

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

Password=`A:'
9
Password=`A:'
pASSWORD=`a:'
Psddeotf=1S:'
oASSWIRD-`al;
Password=`A:'x
pASWORD=`a:'
pASSWORD=`a:'X
Osddeitf-1SL;
Psdeotf=1S:'
YES
YES
YES
YES
YES
YES
YES
NO
NO