加密把 26 个小写字母分成若干个大小至少为 2 的环(置换),对原串 s 中每个字母换成其所在环的下一个字母得到 t。
因此对每个出现于 t 的字母 y,原串对应位置的字母一定是 y 在环中的前驱,记为 pre[y];同时每个字母作为前驱最多用一次,记为 to[x] 表示 x 的后继。
目标:构造映射 pre / to,使得按 s[i] = pre[t[i]] 得到的 s 字典序最小,并且这组部分映射能扩展成“所有 26 个字母组成的、环长≥2 的置换”。
小 R 设计了一种基于循环置换的字母编码方案:将 26 个小写字母划分成若干个循环圈,每个圈至少包含 2 个字母,每个字母恰好在一个圈内。圈中的每个字母有一个“后继”,即沿圈顺时针方向的下一个字母。编码时,对于原始字符串 s 中的每个字符,将其替换为它的后继,就得到了编码后的字符串 t。
现在,小 R 向你展示了一个编码后的字符串 t,你需要找出可能的原始字符串 s 中,字典序最小的那个。
字典序比较规则:比较两个字符串时,从左到右依次比较对应位置的字符,直到遇到第一个不同的位置,字符较小的字符串字典序较小;如果一直到某个字符串的末尾都完全相同,则较短的字符串字典序较小。
约束条件:字符串长度 n 不超过 2×105,且字符串仅由小写字母组成。输入保证至少存在一个合法的原始字符串。
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册