ABC246F typewriter Solution

更好的阅读体验戳此进入

题面

给定 n 个字符串,字符集为小写字母,可以任意选择一个字符串,作为字符库,然后(可多次选择同一字符)任意组成长度为 l 的字符串,求一共能形成多少种长度为 l 的字符串。

Solution

容斥较为显然,显然最终答案也就是,用任意一个字符集形成的字符串减去任意两个的加上任意三个...于是我们考虑令全集为 S=2n1 然后对其进行枚举子集,二进制第 i 位为 10 代表是否考虑这个数,所以枚举的时候直接 __builtin_popcount() 算一下个数,奇数代表加,反之减。然后对于每一个字符串,因为字符集较小,也用一个 int 的二进制表示是否存在对应的字符,然后把需要的字符串都与起来,设数量为 ξ,则此次运算的字符集大小则为 ξ,所以此次答案为 ξl,加减考虑好即可。

Code

UPD

update-2022_10_21 初稿