const int a = 10; 必须在定时义初始化,之后不能修改。
>>1为右移操作符 找到l和r之间的基准值
for (auto it = arr[i].rbegin(); it != arr[i].rend() && *it == '0'; ++it) //寻找前导 0
string arr[MAXN];
arr[i].rbegin() 返回字符串末尾
arr[i].rend() 返回倒叙开头
sort(zrr, zrr + n); //从小到大排序
reverse(zrr, zrr + n); //反转函数 变成了从大到小
// 当 i 是奇数时,它的二进制表示中最右边的位是 1。
// 因此,i & 1 的结果是奇数时为 1(真),偶数时为 0(假)。
unordered_map 是一种基于哈希表实现的关联容器
它存储了键值对(key-value pairs)
包括声明、初始化、插入、查找、更新、删除、遍历、检查存在性、获取大小和清空容器。
使用 std::unordered_map 可以有效地处理键值对数据,尤其是在需要快速访问元素时。
int k = t.find('x'); //查找是的第几个出现的(0为初始点)
简单来说可以用数字指针到某一个字符串
unordered_map s2t;
unordered_map t2s;
建立字符串之间的映射
if (myMap.count(key))
{
// 键存在 //检查是否存在于映射中
}
哈希值的计算
int t = (x % N + N) % N;
1. x%N 防止x过大超出范围
2. +N 防止x是负数
3. 确保最终的索引值在 0~N-1 范围
哈希函数的基 131 (记忆)
u >>= 1; 右移运算符
相当于将数值 u 除以 2 并取整。如果 u 是一个正数或零,右移操作通常有以下效果:
如果 u 是偶数,右移一位后数值变为 u / 2。
如果 u 是奇数,右移一位后数值变为 (u - 1) / 2,因为奇数减1会变为偶数。
堆(Heap)
操作的上下文中,u >>= 1;
通常用于将节点索引除以2,以计算其父节点的索引。
cin >> n >> p + 1 >> m >> s + 1; 从第二个位置开始读取字符
priority_queue<int, vector<int>, greater<int>> heap;
- 第一个参数
int
表示优先队列存储的元素类型。 - 第二个参数
vector<int>
表示用于存储元素的容器类型。这是priority_queue
的默认容器类型,但你也可以使用其他类型的容器。 - 第三个参数
greater<int>
是一个比较函数对象,它定义了元素之间的比较规则。
最大堆:priority_queue<int> max_heap; //默认是最大堆
操作
push (value):
pop ():
top ():取顶端元素
empty (): 判断是否为空 如果是则为true
size (): 元素数量
swap (priority_queue& other):
clear ():清空
range[i] = {l, r};
//l 和 r 是两个整数,它们分别赋值给 range[i].l 和 range[i].r
//这种方法更加简洁
abs()代表绝对值 可用作计算区间距离
//初始化
pair<int, int> p1(1, 2);
int first = p1.first; // 获取第一个元素
int second = p1.second; // 获取第二个元素
vector<int> a(n,1);
创建一个长度为n
的向量a
,初始值都为1
邻接表的使用方法
const int N = 100010;
vector<int> tree[N];
void addEdge(int a, int b) {
tree[a].push_back(b); // 从 a 到 b 的边
tree[b].push_back(a); // 如果是无向图,还需要从 b 到 a 的边
}
for (int i = 0; i < N; i++) {
cout << "Node " << i << " is connected to: ";
for (int j : tree[i]) {
cout << j << " ";
}
cout << endl;
}//打印出来
/*
栈:后进先出(类似装钢镚)
std::stack<int> myStack; //创立栈
myStack.push(10); //添加
myStack.top() //查看栈顶
myStack.pop() //除去栈顶
if (!myStack.empty()) //检查栈是否为空
队列:后进后出(往尾巴后面添加)
std::queue<int> myQueue;
myQueue.push(10); //只能往后边添加
myQueue.front() //检查队首
myQueue.pop(); //移除队首
if (!myQueue.empty()) //检查是否为空
*/