在此。
给你 n n n个字符串,其中选择 k k k个,如果合法则将’?’变成字符( 26 26 26个都可以,前提是合法)构成一个只含小写字母的字符串,求可以变成多少种字符串。 合法要求:一个位置上要不只有一种小写字母,要不是’?’。 解法:可以用状压 d p dp dp或者容斥原理+组合数完成。
首先铺垫三个内容:交集、并集、集合大小。
交集 用符号 ∩ \cap ∩表示,表示几个集合中都有的元素。并集 用符号 ∪ \cup ∪表示,表示几个集合中所有的元素(不算重复的)。集合大小 集合大小表示一个集合的元素个数。比如集合 A A A的元素个数表示为 C a r d ( A ) Card(A) Card(A)或 ∣ A ∣ |A| ∣A∣。然后如果要求多个集合(分别为 a 1 , a 2 , ⋯ , a n a_1,a_2,\cdots,a_n a1,a2,⋯,an)的并集,有公式 ∣ a 1 ∪ a 2 ∪ ⋯ ∪ a n ∣ = ∑ 1 ≤ i ≤ n ∣ a i ∣ − ∑ 1 ≤ i < j ≤ n ∣ a i ∩ a j ∣ + ∑ 1 ≤ i < j < k ≤ n ∣ a i ∩ a j ∩ a k ∣ − … + ( − 1 ) n + 1 ∣ a 1 ∩ a 2 ∩ ⋯ ∩ a n ∣ \begin{aligned}\left|a_1\cup a_2\cup\cdots\cup a_n\right|=\sum_{1\le i\le n}\left|a_i\right|-\sum_{1\le i<j\le n}\left|a_i\cap a_j\right|+\sum_{1\le i<j<k\le n}\left|a_i\cap a_j\cap a_k\right|-\ldots+\left(-1\right)^{n+1}|a_1\cap a_2\cap \cdots \cap a_n|\end{aligned} ∣a1∪a2∪⋯∪an∣=1≤i≤n∑∣ai∣−1≤i<j≤n∑∣ai∩aj∣+1≤i<j<k≤n∑∣ai∩aj∩ak∣−…+(−1)n+1∣a1∩a2∩⋯∩an∣ 合并方案: 4. ‘?’与小写字母合并为小写字母 5. ‘?’与’?’合并成’?’ 6. 两个不同的小写字母合并无效, r e t u r n return return
对于每一个 k ≤ i ≤ n k\le i\le n k≤i≤n,然后合并我们可以求出 a n s i ans_i ansi表示 26 26 26的(当 k = i k=i k=i时合并这几个串)问号数量次幂之和。 然后我们就可以进行容斥。 可以发现,设答案为 a n s w e r answer answer, 则 a n s w e r = ∑ i = k n a n s i × ( − 1 o r 1 ) × C i k \begin{aligned}answer=\sum_{i=k}^{n}{ans_i\times\left(-1\ or\ 1\right)\times C_i^k}\end{aligned} answer=i=k∑nansi×(−1 or 1)×Cik − 1 -1 −1或 1 1 1就是上面公式 + + +或 − - −,是奇负偶正。 具体为什么这么写,是因为我们构造了 n − k + 1 n-k+1 n−k+1个交集。然后每个并集分别为 C i k a n s i C_i^kans_i Cikansi。原来的再乘以与 k k k可能重复的数量 C i k C_i^k Cik。 具体实现时应该加上模数再模,以免负数情况。