![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
有别于STL的容器,用数组模拟,优点是速度快。
矩阵不需要秩
你被击倒多少次都不重要,重要的是你有多少次爬了起来。
展开
-
静态单链表
这里要初始化,head=-1;注意这里头指针就是静态链表的第一个元素,而不是head头指针。因为我们插入一个元素,idx++。所以第k个插入的元素就是e[k-1],原创 2023-09-14 12:08:48 · 21 阅读 · 0 评论 -
静态双链表
双链表的话,这里不定义指针,而是定义左右两个节点。l[ ]和r[ ]数组的意思是:l[k]表示的意思是k左边的节点,存的值是左节点的地址,r[ ]也一样。还有也要注意一下add操作,倒数第二个和倒数第三个不要写反。刚开始要初始化一下。这里就不需要add_to_head函数了,因为我们有左节点。原创 2023-09-14 13:51:08 · 60 阅读 · 0 评论 -
单调队列
这里的话,单调队列里面的元素始终是单调的,并且前面的元素比后面的元素先遍历到,所以要判断元素是否不在窗口内了,只需每次判断对头是否在窗口内就行了,这个必须在最前面判断。原创 2023-09-14 22:23:06 · 21 阅读 · 0 评论 -
KMP算法
这里在进行匹配的时候,j表示的含义是对于每个i而言已经匹配了j个字符,然后这里判断j+1和i是是不是匹配的,如果不匹配j=ne[j],这里的ne[i]表示的是p[i]包含i前面最大的前后缀的长度,所以就可以直接移动了。求ne数组的话,如果不好理解,就可以先写KMP匹配过程,然后再写next数组构造过程,就相当于把s写成p,然后在更新每个ne[i]的值。刚开始的话,ne[1]=0,因为只有一个字符的话,最大的前后缀长度为0,因为不可以超过i本身,否则移动跟没移动一样。原创 2023-09-15 17:04:46 · 30 阅读 · 0 评论 -
trie数--最大异或对
我想了半天,我刚开始以为每一位的影响力是一样的,所以贪心是错误的。但是呢,这里我们是从最高位开始枚举的,所以我们要每次局部最优就可以了,如果存在两个选择,我们就选那个不一样的,因为如果我们选一样的话,那么就小于那个不一样的,因为越高位它的影响力是越大的。所以用trie树存储一下每个数(一个数也就是一个树)就可以了。最后遍历一下每个数,res取一个max就可以了。注意,这里我们有31位,所以最大就是31*N(N个数)。如果2^0+2^1+......+2^32会很大,所以M=31*N。原创 2023-09-15 22:30:05 · 29 阅读 · 0 评论 -
并查集
因为我们是先把a的祖先改为b的祖先,那么此时计算数量的话,c[b的祖先]+=c[a的祖先]//因为有上一句,所以这里相当于c[b的祖先]+=c[b的祖先],那么显然是错的。所以这里计算数量的时候,要先加,然后在更新。原创 2023-09-16 12:29:49 · 26 阅读 · 0 评论 -
堆和堆排序
用数组模拟小根堆,主要就是up和down函数。原创 2023-09-17 14:54:44 · 26 阅读 · 0 评论 -
哈希和字符串哈希
字符串哈希的话,首先应该吧字符串哈希成一个数字,这里应该哈希成一个p进制数,但是p取什么最不容易产生冲突呢?经过权威验证,p=131是最好的,所以只要是算法题,直接p取131就是最好的。但是呢N=2^64最好,这个可以不用取模,直接设置成unsigned long long就可以,因为溢出的话编译器自动进行取模。计算一个区间的哈希值使用前缀和,然后比较一下两个区间的哈希值就可判断字符串是否相等。这里使用拉链法来进行存储,也就是链表的操作,但是首先要初始化一下h数组元素值全为-1。原创 2023-09-18 19:43:57 · 30 阅读 · 0 评论