P13915 [PO Final 2024] 鬼抓人 / Tag

题目描述

每天,有 $N$ 名查尔姆斯的学生在 Kemigården 集合玩捉人游戏。在这个游戏中,有一个人是“猎人”,当这个人碰到其他人时,被碰到的人就会变成新的猎人。玩了几次之后,你意识到情况似乎不太对劲。也就是说,你注意到猎人的数量突然多了起来。如果大家都遵守规则,猎人应该始终只有一个。然而就在前几天,游戏失控了,突然有十几个嗜血的工科学生在追你。 你意识到一定有些学生在自己不是猎人的情况下仍然去碰别人。现在,你想要找出哪些学生做了这种作弊行为。如果一个学生在知道自己不是猎人的情况下仍然去碰别人,那么他就是“作弊者”。幸运的是,昨天你非常仔细地记录了参加游戏的学生以及是谁碰了谁。在收集了这些信息之后,你准备编写一个程序来找出哪些学生作弊了。

输入格式

第一行包含两个整数 $N$ 和 $M$($2 \leq N \leq 10^5$, $1 \leq M \leq 10^5$),分别表示参加游戏的学生数量和发生的碰人次数。 接下来一行包含以空格分隔的学生名字 $s_1, ..., s_N$。每个名字由 $1\sim20$ 个字符组成,只包含字母 $\texttt{a}\sim \texttt{z}$,且都互不相同。列表中的第一个名字是游戏开始时的猎人。 最后有 $M$ 行,每一行格式为「$s_i$ tar $s_j$」(其中 $s_i \neq s_j$),表示 $s_i$ 碰了 $s_j$。这些行按时间顺序给出,表示整个游戏中所有发生的碰人事件。由于你观察得非常仔细,你确定没有漏掉任何一次碰人。

输出格式

首先输出一个整数,即作弊的学生数量。接着在下一行输出这些作弊学生的名字,按字典序排序。

说明/提示

### 样例解释 #### 样例 $1$ 解释 一开始,olle 是猎人。这意味着 alexander 在碰到 joshua 时就是作弊。之后,olle 和 joshua 都认为自己是猎人。由于 joshua 认为自己是猎人,所以他在碰到 alexander 时并没有作弊。最后,olle 碰到 joshua,此后 joshua 和 alexander 都认为自己是猎人。结论是,唯一作弊的人是 alexander。 ### 子任务 **本题采用捆绑测试。** | 子任务编号 | 分值 | 限制 | |-------|-------------|-------------| | $1$ | $10$ | $M = 1$ | | $2$ | $15$ | $N = 2$ | | $3$ | $15$ | joshua 参加了游戏;要么没人作弊,要么只有 joshua 作弊 | | $4$ | $20$ | $N \leq 200$ | | $5$ | $40$ | 无额外限制 |