CF2070F Friends and Pizza
题目描述
Monocarp 有 $n$ 个披萨,第 $i$ 个披萨包含 $a_i$ 片。披萨用从 A 开始的拉丁字母大写字符表示(第 $n$ 个披萨对应第 $n$ 个拉丁字母)。
Monocarp 还有 $m$ 个朋友,他想要邀请其中恰好两人来吃披萨。对于每个朋友,Monocarp 知道该朋友喜欢哪些披萨。
当朋友到达 Monocarp 家后,每个披萨的处理方式如下:
- 如果该披萨不被任何被邀请的朋友喜欢,Monocarp 将吃掉它;
- 如果该披萨恰好被一位被邀请的朋友喜欢,该朋友将吃掉它;
- 如果该披萨被两位朋友都喜欢,他们将尝试分食。若披萨包含偶数片,两人各吃一半;若包含奇数片,他们会因争夺额外一片而发生争吵——Monocarp 不喜欢这种情况。
对于每个 $k$ 从 $0$ 到 $\sum a_i$,计算选择两个朋友的方式数,使得朋友不会争吵且 Monocarp 恰好吃掉 $k$ 片。
输入格式
第一行包含两个整数 $n$ 和 $m$($1 \le n \le 20$;$2 \le m \le 5 \cdot 10^5$)——分别表示披萨数量和朋友数量。
第二行包含 $m$ 个字符串 $s_1, s_2, \dots, s_m$($1 \le |s_i| \le n$),其中 $s_i$ 由互不重复的 A 到第 $n$ 个拉丁字母组成,表示第 $i$ 个朋友喜欢的披萨。每个 $s_i$ 中的字符按字典序(字母顺序)排列。
第三行包含 $n$ 个整数 $a_1, a_2, \dots, a_n$($1 \le a_i \le 2 \cdot 10^4$)——各披萨的片数。
输出格式
输出 $\sum a_i + 1$ 个整数,其中第 $k$ 个整数(从 $0$ 开始)表示满足条件(朋友不争吵且 Monocarp 吃 $k$ 片)的选法数目。
说明/提示
以第一个示例的所有朋友对为例:
- 邀请朋友 $1$ 和 $2$:他们将吃掉披萨 $1$ 和 $2$,Monocarp 吃披萨 $3$;
- 邀请朋友 $1$ 和 $3$:他们将吃掉所有披萨;
- 邀请朋友 $1$ 和 $4$:他们将吃披萨 $1$ 和 $2$,Monocarp 吃披萨 $3$;
- 邀请朋友 $1$ 和 $5$:他们将吃掉所有披萨;
- 邀请朋友 $1$ 和 $6$:他们将吃披萨 $1$ 和 $3$,Monocarp 吃披萨 $2$;
- 邀请朋友 $2$ 和 $3$:因披萨 $2$ 发生争吵;
- 邀请朋友 $2$ 和 $4$:因披萨 $2$ 发生争吵;
- 邀请朋友 $2$ 和 $5$:因披萨 $2$ 发生争吵;
- 邀请朋友 $2$ 和 $6$:他们将吃掉所有披萨;
- 邀请朋友 $3$ 和 $4$:因披萨 $2$ 发生争吵;
- 邀请朋友 $3$ 和 $5$:因披萨 $2$ 发生争吵;
- 邀请朋友 $3$ 和 $6$:因披萨 $3$ 发生争吵;
- 邀请朋友 $4$ 和 $5$:因披萨 $2$ 发生争吵;
- 邀请朋友 $4$ 和 $6$:他们将吃掉所有披萨;
- 邀请朋友 $5$ 和 $6$:因披萨 $3$ 发生争吵。
翻译由 DeepSeek R1 完成