摘要:
**位运算都是对操作数在内存中的二进制位进行操作** 注意:只能操作整数类型,不能操作浮点数! 因为整数在内存中表示的是自己本身的值,而浮点数却不是(IEEE745) 这种限是编译器限制的,因为对以浮点表示法的浮点数进行位运算没有数学意义 搜罗一番,只找到其一个用途,从硬件上快速支持浮点数fabs, 阅读全文
摘要:
模板: ```c++ for (int i = 0, j = 0; i < n; i++) { while (j < (i) && check(i, j)) j++; //题目的具体逻辑 } ``` 核心思想: 先把暴力的解法写出来,看是否有单调性,若有则可用双指针 ```c++ for (int 阅读全文
摘要:
## 前缀和 ### 一维前缀和 公式: $$ s[i] = s[i - 1] + a[i] $$ 模板: ```c++ const int N = 10000 + 10; int n,m; int a[N],s[N]; int main() { scanf("%d%d",&n,&m); for ( 阅读全文
摘要:
> 化大为小 离散化的本质是建立了一段数列到自然数之间的映射关系(value -> index),通过建立新索引,来缩小目标区间,使得可以进行一系列连续数组可以进行的操作比如二分,前缀和等… 化大为小,把稀疏离散化简为稠密连续的一段 模板: ```c++ vector alls; // 存储所有待离 阅读全文
摘要:
求$a^n$: 传统做法:$a \times a \times ...\times a$,时间复杂度O(n) 快速幂算法: $5^{13} \to 5 \times 5^6 \times 5^6 \to 5 \times 15625 \times 15625$ 复用相同的数 $2^8 \to (2^ 阅读全文
摘要:
## 二分查找 ### 要求 数据是有序且单调的 ### 模板 从左到右 ```c++ while (l > 1; //(l+r)/2 if (check(mid)) r = mid; // check()判断mid是否满足性质 //arr[mid] >= x else l = mid + 1; } 阅读全文
摘要:
## 递归 递归的基本思想是某个函数直接或者间接地调用自身,这样原问题的求解就转换为了许多性质相同但是规模更小的子问题。求解时只需要关注如何把原问题划分成符合条件的子问题,而不需要过分关注这个子问题是如何被解决的。 递归代码最重要的两个特征:结束条件和自我调用。自我调用是在解决子问题,而结束条件定义 阅读全文
摘要:
> 高效地存储和查找字符串集合的数据结构 1. 根节点不包含字符,除根节点外的每一个子节点都包含一个字符。 2. 从根节点到**某一个节点**,路径上经过的字符连接起来,为该节点对应的字符串。 3. 每个节点的所有子节点包含的字符互不相同。 通常在实现的时候,会在节点结构中设置一个标志,用来标记该结 阅读全文
摘要:
>KMP算法是一种**字符串匹配**算法,可以在 O(n+m) 的时间复杂度内实现两个字符串的匹配 KMP算法通过记录**相等前后缀的最大长度**使得匹配串上的指针不回溯,并且快速跳过不匹配区域 其中最主要的是模式串中个个位置的公共(相等,~~公共这两个字搞得我迷糊了半天~~)前后缀的最大值,它将是 阅读全文
摘要:
## 通过数组模拟 ### 栈 ```c++ int stk[N], top; void init() { // 初始化 top = 0; } bool isEmpty() { // 判断是否为空 return top == 0; } bool isFull() { return top >= MA 阅读全文