森林大学为学生提供 $N$ 门课程,学生必须修完所有课程才能获得学位。课程一次只能修一门——你必须在开始下一门课程之前完成当前课程。每门课程要么是基础课程(意味着无需任何先修知识即可修读),要么是进阶课程(在这种情况下,恰好有一门其他课程是其先修课程)。
学生必须在修读某门课程之前修读其先修课程,尽管它们不需要紧接着修读。一门课程可能是多门其他课程的先修课程。先修关系中不存在循环。任何满足先修规则的 $N$ 门课程的修读顺序都是获得学位的有效顺序。
毕业时,大学会通过在你的毕业帽上打印你所修课程顺序的缩写版本来纪念这一时刻。更准确地说,这个缩写版本是一个字符串,由你所修的每门课程名称的首字母按修读顺序组成。例如,如果你按顺序修读了 Coding 课程和 Jamming 课程,你的毕业帽上将显示 CJ。将某些“酷词”(cool words)作为毕业帽上字符串的子串被认为是很时髦的。
考虑所有可能的有效课程修读顺序。对于每个酷词,你需要找出在毕业帽字符串中包含该酷词作为子串(至少一次)的序列所占的比例。注意,我们感兴趣的是课程序列的比例,而不是不同毕业帽字符串的比例。(由于多门课程可能以相同的字母开头,因此可能的字符串数量可能少于课程序列的数量。)
对于 Code Jam 来说,这有些不同寻常,我们只需要该问题的近似答案;请特别注意输出格式。
输入格式
输入的第一行包含测试用例的数量 $T$。接下来是 $T$ 个测试用例。每个测试用例包含五行,顺序如下:
- 课程数量 $N$。
- $N$ 个整数;其中第 $i$ 个整数给出第 $i$ 门课程的先修课程编号,如果第 $i$ 门课程是基础课程,则为 0。课程编号从 1 到 $N$。
- $N$ 个大写英文字母(中间没有空格),其中第 $i$ 个字符表示第 $i$ 门课程名称的首字母。
- 酷词的数量 $M$。
- $M$ 个酷词,每个酷词仅由大写英文字母组成。
输出格式
对于每个测试用例,输出一行 Case #x: y1 y2 ... yM,其中 $x$ 是测试用例编号(从 1 开始),$y_i$ 是毕业帽字符串中包含第 $i$ 个酷词作为子串的有效课程序列所占的比例。
如果 $y_i$ 与正确答案的绝对误差在 0.03 以内,则视为正确。
样例
样例输入 1
2 2 0 1 CJ 4 CJ C D JC 3 0 1 0 BAA 3 AA AAB ABA
样例输出 1
Case #1: 1.0 1.0 0.0 0.0 Case #2: 0.67 0.0 0.33
说明
样例输出显示了针对样例测试用例的一组可接受答案。在允许的精度范围内,其他答案也是可能的。
在样例 1 中,课程 1 (C) 是一门基础课程,是进阶课程 2 (J) 的先修课程。完成课程的唯一方法是先修课程 1,然后修课程 2。这产生了字符串 CJ。因此,酷词 CJ、C、D 和 JC 在 1 种可能的情况中分别作为子串出现了 1、1、0 和 0 次。
在样例 2 中,基础课程 1 (B) 是进阶课程 2 (A) 的先修课程,课程 3 (A) 是另一门基础课程。完成课程有三种可能的方法:
- 先修课程 1,然后课程 2,然后课程 3(字符串:BAA)
- 先修课程 1,然后课程 3,然后课程 2(字符串:BAA)
- 先修课程 3,然后课程 1,然后课程 2(字符串:ABA)
酷词 AA、AAB 和 ABA 在 3 种可能的情况中分别作为子串出现了 2、0 和 1 次。