QOJ.ac

QOJ

Limite de temps : 2 s Limite de mémoire : 512 MB Points totaux : 100

#12904. 可分解单字语言

Statistiques

确定性有限自动机 (DFA) 是一个有序集合 $(\Sigma, U, S, T, \phi)$,其中 $\Sigma$ 是称为输入字母表的有限集合,在本题中 $\Sigma = \{a, b, \dots, z\}$,$U$ 是有限状态集,$S \in U$ 是初始状态,$T \subset U$ 是终止状态集,$\phi : U \times \Sigma \rightarrow U$ 是转移函数。

自动机的输入是 $\Sigma$ 上的字符串 $\alpha$。初始时,自动机处于状态 $S$。每一步,自动机读取输入字符串的第一个字符 $c$,并将状态更改为 $\phi(u, c)$,其中 $u$ 是当前状态。然后从输入字符串中移除第一个字符,并重复该步骤。如果输入字符串为空后自动机处于终止状态,则它接受初始字符串 $\alpha$,否则拒绝它。由自动机 $A$ 接受的所有单词的集合记为 $L(A)$。

我们可以将 DFA 可视化为一个有向图,其状态为顶点,转移为标记有字符的边。终止状态显示为双圆圈顶点,初始状态由箭头标记。下图左侧展示了语言 $(ab)^*$ 的自动机,该语言由零个或多个重复的单词 “ab” 组成。下图右侧展示了语言 $a^*ba^*ba^*$ 的自动机,该语言由 “a” 和 “b” 组成且包含两个 “b”。为了清晰起见,标记为 “*” 的边表示所有未明确绘制的转移。

单词集合 $X$ 如果等于某个 DFA $A$ 的 $L(A)$,则称为正则语言。正则语言 $X$ 的索引(记为 $ind(X)$)是使得 $L(A) = X$ 的 DFA $A$ 中的最小状态数。例如,上图所示的两个自动机确实是所描述语言的最小 DFA,因此 $ind((ab)^*) = 3$ 且 $ind(a^*ba^*ba^*) = 4$。

众所周知,如果 $X_1$ 和 $X_2$ 是两个正则语言,则它们的交集 $X_1 \cap X_2$ 也是一个正则语言。例如,上述两个语言的交集是语言 $Y = (ab)^* \cap (a^*ba^*ba^*) = \{abab\}$,其中包含单个单词 “abab”。显然,单单词语言是正则的,$Y$ 的自动机如下图所示。

容易看出,如果 $W$ 是一个单单词语言 $W = \{w\}$,且 $w$ 的长度为 $n$,则 $W$ 的索引等于 $n + 2$。

如果正则语言 $X$ 可以表示为两个正则语言的交集 $X = X_1 \cap X_2$,且满足 $ind(X) > ind(X_1)$ 和 $ind(X) > ind(X_2)$,则称其为可分解的。例如,单单词语言 $Y = \{abab\}$ 是可分解的。

给定一个长度为 $n$ 的单词 $w$,判断单单词语言 $W = \{w\}$ 是否可分解。如果可分解,请找出两个自动机 $A_1$ 和 $A_2$,使得 $A_1$ 和 $A_2$ 的状态数均小于 $n + 2$,且 $W = L(A_1) \cap L(A_2)$。

输入格式

输入文件包含多个测试用例。 每个测试用例由单独一行上的单词 $w$ 组成,$w$ 由小写英文字母组成,长度在 $1$ 到 $50$ 之间(含)。 一个输入文件中最多有 $100$ 个测试用例。

输出格式

对于每个测试用例,如果相应的单单词语言是可分解的,首先打印 “YES”,否则打印 “NO”。如果语言是可分解的,则必须接着输出两个 DFA 的描述。每个 DFA 的描述必须以 $k$ 开头——状态数,$1 \le k \le n + 1$,其中 $n$ 是输入单词的长度。令状态编号为 $1$ 到 $k$,初始状态为状态 $1$。然后打印 $t$——终止状态的数量,$1 \le t \le k$,随后是 $t$ 个 $1$ 到 $k$ 之间的整数,表示终止状态。接下来的 $k$ 行必须各包含 $26$ 个整数:对于状态 $u$,打印 $\phi(u, a), \phi(u, b), \dots, \phi(u, z)$。

样例

输入 1

abab
a

输出 1

YES
3
1
1
2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
4
1
3
2 1 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
3 2 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
4 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
NO

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.