CF383E Vowels 题解

这篇博客介绍了CF383E Vowels的算法解题思路,主要涉及容斥原理和动态规划。通过考虑字符串长度为3的特殊情况,采用暴力容斥计算,然后利用动态规划处理集合合并,通过删除元素的贡献来优化计算。合法集合可以通过取补集转换,而不合法集合可以借助高位前缀和维护。

CF383E Vowels

CF383E Vowels

emmm 可以自己想出来的简单题。


就是考虑容斥,也就是 A ∪ B = A + B − A ∩ B A \cup B = A + B - A \cap B AB=A+BAB。三个数的情况也是同理。发现每个字符串的长度 = 3 = 3 =3 所以我们可以直接对于集合大小是 3 3 3 的进行暴力容斥计算。

之后我们考虑集合的合并,直接进行状压 D p \tt Dp Dp,我们考虑删除最前面和最后面的那一位的贡献之和减去同时删除的贡献即可。


或者说我们可以考虑更好写的情况。我们发现合法的集合肯定是至少包含其中一个位置的。

对于至少可以通过取补集转换成全部不包含

对于一个不合法的集合肯定是所有位置都在这里的,那么后者完全可以使用高位前缀和进行维护,我们对于每一个补集进行计算即可。

显然所有的集合都被计算过了。因为两个交集为空,并集为全集的集合会互相计算。

#include <bits/stdc++.h>
using namespace std;

//#define Fread
//#
在没有更多上下文的情况下,`vowels.count` 的含义需要分不同场景来看。 ### 在 C++ 标准库 `std::unordered_map` 或 `std::map` 中 如果 `vowels` 是一个 `std::unordered_map` 或者 `std::map` 类型的对象,`vowels.count(key)` 是一个成员函数,用于返回指定 `key` 在容器中出现的次数。对于这两种容器,由于键是唯一的,所以 `count` 函数返回值要么是 0(键不存在),要么是 1(键存在)。 示例代码如下: ```cpp #include <iostream> #include <unordered_map> int main() { std::unordered_map<char, int> vowels = {{'a', 1}, {'e', 2}, {'i', 3}}; // 检查 'a' 是否在 vowels 中 if (vowels.count('a')) { std::cout << "'a' is in the map." << std::endl; } // 检查 'o' 是否在 vowels 中 if (!vowels.count('o')) { std::cout << "'o' is not in the map." << std::endl; } return 0; } ``` ### 在 Python 集合(`set`)中 如果 `vowels` 是一个 Python 的 `set` 对象,`vowels.count` 在 Python 的 `set` 中并不存在这个方法,`set` 类型使用 `in` 关键字来判断元素是否存在于集合中。与之类似的是 Python 的 `list` 类型有 `count` 方法,`vowels.count(item)` 用于返回 `item` 在 `vowels` 列表中出现的次数。 示例代码如下: ```python # 列表使用 count 方法 vowels = ['a', 'e', 'i', 'a'] count_a = vowels.count('a') print(f" 'a' appears {count_a} times in the list.") # 集合不使用 count 方法,使用 in 关键字 vowels_set = {'a', 'e', 'i'} if 'e' in vowels_set: print(" 'e' is in the set.") ``` ### 在一些自定义类中 如果 `vowels` 是自定义类的一个对象,`vowels.count` 可能是该类自定义的一个成员函数或属性,用于特定的计数功能,例如统计元音字符的数量等。比如在一些处理字符串中元音和辅音计数的程序里可能会有自定义的 `count` 函数来对元音字符进行计数[^1]。 ### 与引用问题相似的计数问题示例 在一些题目中会涉及到元音字符的计数问题,例如给定一个字符串,统计其中元音和辅音的数量,或者给定特定规则构造元音字符串并计数等。如“第五章第四十九题”要求用户输入一个字符串,程序显示该字符串中元音和辅音的数量;“1220. Count Vowels Permutation”则是根据特定规则生成特定长度的元音字符串并计算其数量[^1][2][3][4][5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值