CF1085E Vasya and Templates

题目描述

Vasya 拥有三个字符串 $s$、$a$ 和 $b$,它们都只包含前 $k$ 个拉丁字母。 我们定义“模板”为长度为 $k$ 的字符串,且每个前 $k$ 个拉丁字母在其中恰好出现一次(因此共有 $k!$ 种不同的模板)。将模板 $p$ 应用于字符串 $s$,即将 $s$ 中的每个字符 $c$ 替换为 $p_i$,其中 $i$ 是字母 $c$ 在字母表中的序号。例如,将模板 "bdca" 应用于字符串 "aabccd",得到字符串 "bbdcca"。 Vasya 想知道,是否存在这样一个模板,使得将其应用于 $s$ 后得到的字符串,字典序不小于字符串 $a$,且不大于字符串 $b$。 如果存在多个满足条件的模板,输出任意一个即可。 若对于某个 $i$($1 \le i \le n$),有 $a_i < b_i$,且对于所有 $j$($1 \le j < i$),有 $a_j = b_j$,则称字符串 $a$ 的字典序小于字符串 $b$。 你需要独立地回答 $t$ 组测试数据。

输入格式

第一行包含一个整数 $t$($1 \le t \le 10^6$),表示测试数据组数。 在 hacks 中只能使用 $t = 1$。 接下来的每组测试数据包含如下内容: 每组测试数据的第一行包含一个整数 $k$($1 \le k \le 26$),表示模板的长度。 第二行包含字符串 $s$($1 \le |s| \le 10^6$)。 第三行包含字符串 $a$。 第四行包含字符串 $b$。 字符串 $s$、$a$ 和 $b$ 长度相同($|s| = |a| = |b|$),且都只包含前 $k$ 个小写拉丁字母。 保证 $a$ 的字典序不大于 $b$。 保证所有测试数据中字符串的总长度不超过 $3 \cdot 10^6$。

输出格式

对于每组测试数据,输出如下内容: 如果不存在满足条件的模板,第一行输出 "NO"。 否则,第一行输出 "YES",第二行输出一个模板($k$ 个小写字母,每个前 $k$ 个拉丁字母恰好出现一次)。 如果存在多个满足条件的模板,输出任意一个即可。

说明/提示

由 ChatGPT 4.1 翻译