模板
沙雕.
此人很帅,什么都没有写
展开
-
P3803 【模板】多项式乘法 ——FFT/NTT模板
>>>FFT>>>NTT要点:①A(x) = A1(x)+ wnk*A2(x) A(x+n/2) = A1(x)-wnk*A2(x)②单位圆的两个复数相乘得到的是角度相加后单位圆上对应的复数(模长相乘,极角相加)③重新转回系数表示,FFT用的是共轭复数,最后还要除以问题的规模NTT用的是规模的逆元④NTT每个规模n下对应的一单...原创 2019-12-07 18:05:54 · 499 阅读 · 0 评论 -
Splay/伸展树(P3369 P3391 P2042)
什么是splay?一种平衡二叉树。什么是平衡二叉树?需要先了解什么是:二叉搜索树——简称BST,每个节点最多有两个子节点,左子比当前节点小,右子比当前节点大。因此对于插入和查找第k小的值,都可以从根递归着进行下去,在到达递归终点之前,不是选择这个节点左儿子就是右儿子,因此,操作的复杂度 = 树的深度。然而,这棵树的形状会因为你插入数字的顺序和大小不同,导致层数过大。比如你插...原创 2019-10-28 20:40:39 · 554 阅读 · 0 评论 -
线性基学习
>>>大佬写的贼好建议参考线性基的基本概念:①引入一下给出一个数组a[],我们从a中得到一个数组b[],a数组中的任何数都可以由b中一个或者几个数的异或和得到,b就是我们所说的线性基。②b数组本身具有什么性质?(1)b数组的数量最多 = 数组a数据最大值的二进制位数比如说a最大是int最大,那么最大是2^31-1,需要31位来表示,所以此时线性基最多3...原创 2019-10-12 20:50:43 · 186 阅读 · 0 评论 -
树链剖分(P3384)
树链剖分的作用树链剖分用于解决树上区间询问,主要有两种:给出两点,询问和修改之间的路径,又或者给出一个点,询问和修改整颗子树的信息。树链剖分需要配合其他数据结构如线段树等一起使用说白了,树链剖分只是根据询问提供正确的区间针对路径给出区间 的 复杂度为O(logN)针对子树给出区间 的 复杂度为O(1)如何实现?树链剖分,顾名思义,就是把树分成链。分为重链和...原创 2019-10-12 19:41:13 · 137 阅读 · 0 评论 -
动态开点线段树(P1908/洛谷1908)
什么是动态开点线段树:假设操作次数为q,维护区间大小为m普通的线段树会先把所有可能需要的节点开辟出来需要的空间为O(4*m)这样可以:1.方便的通过节点下标所引导对应的左右儿子节点2.所有需要的节点都已经有了,不必在额外创建新节点动态开点线段树则是只开辟需要的节点,因此每个节点左右儿子都要记录需要的空间为O(q*logm)这样可以:1.很明显可以节省空...原创 2019-09-16 19:40:13 · 1299 阅读 · 0 评论 -
可持久化线段树/主席树 (P3919 + P3834)
建议先了解一下动态开点线段树,可以参考一下我写的这篇什么是可持久化线段树:若询问次数为q,维护区间为m则所需空间为O(q*logm)通过root[]数组,记录不同版本的根节点编号,我们可以方便的在某个版本上修改和查询问题1:什么是不同的版本?我在某个版本的线段树上做了某次修改,修改后的线段树,就是不同与之前的一个船新版本。问题2:为什么只要O(q*logm)?对于在...原创 2019-09-16 21:22:38 · 125 阅读 · 0 评论 -
可持久化无旋treap(良心讲解 P3835)
前置技能:无旋treap什么是可持久化平衡树?每经过一次操作,当前状态的整棵树就成为一棵全新版本的树,给每个版本编个号,我们可以根据版本号查找这格版本的树中的一些信息,也可以在这个版本上进行修改生成全新版本。我们需要保留每个版本的所有信息。可持久化无旋treap的大体思想由于treap的树的期望深度为O(logn)级别,所以每次操作(插入/删除等)只涉及O(logn)个节点的修...原创 2019-09-23 21:26:18 · 348 阅读 · 0 评论 -
exKMP算法 (模板+图片加深理解)
先上代码:const int maxn=100010; //字符串长度最大值int nt[maxn],ex[maxn]; //ex数组即为extend数组///预处理计算next数组void GETNEXT(char *str){ int i=0,j,po,len=strlen(str); nt[0]=len;///用自己作为后缀与自己匹配 while(s...原创 2019-07-04 19:56:07 · 2321 阅读 · 1 评论 -
后缀平衡树模板(例题SPOJ - DISUBSTR)
删除操作还没有验证,原本例题是HYSBZ5084,不过网站好像炸了,一直没法提交,目前不知道删除代码正确性,不过插入和维护height都已经验证过意思就是你可能会被这篇文章演平衡树用treap写的什么是后缀平衡树?利用平衡树动态维护后缀数组。可以支持的操作为加入一个字符到串末尾或者删除末尾一个字符。先搞清两个问题:只能在末尾操作吗?中间插入删除会影响多个后缀,末尾插...原创 2019-09-30 20:47:08 · 185 阅读 · 0 评论 -
无旋treap/fhq-treap 模板 (附良心讲解 + 例题:洛谷P3369 普通平衡树)
博文更新:20190917 更新了一下merge和split函数的递归理解定义:无旋treap,就是不通过旋转的维护堆性质的treap,根本的原理还是 tree + heap。与普通treap的不同之处:大概就是可以可持久化。然后区间操作的话,不知道有旋的行不行,用无旋的反正是比较好搞,区间操作举个例子就是让你把一段区间的数反过来等等。现在听着可能区间操作什么的可能莫名...原创 2019-09-09 22:57:45 · 713 阅读 · 0 评论 -
笛卡尔树模板
如果学过treap(一种平衡二叉树),笛卡尔树应该很好理解本文只介绍基础的建树,没有深入的东西。(你懂我意思吧)笛卡尔树也是二叉树+堆一、二叉树与堆的概念可以看看我这篇,顺便把treap学了也可以,简单哒二、笛卡尔树的结构笛卡尔树可以按顺序插入一个数组,我们将下标当值插入二叉树,然后数组的值作为“优先级”,维护堆的性质。盗一份网上的图你们参考一下,结构就是这个样子...原创 2019-09-07 21:27:47 · 302 阅读 · 0 评论 -
Treap模板
Treap = 二叉搜索树 + 堆一、二叉搜索树简称BST,每个节点最多有两个子节点,左子比当前节点小,右子比当前节点大。因此对于插入和查找第k小的值,都可以从根递归着进行下去,在到达递归终点之前,不是选择这个节点左儿子就是右儿子,因此,操作的复杂度 = 树的深度。然而,树会根据插入的数的不同,产生不同的形状,并不是我们认为的logN,最好情况下才是O(logN),要达到O(lo...原创 2019-08-30 20:09:39 · 346 阅读 · 0 评论 -
欧拉筛求每个数比它小互质的数的个数
作用:同标题参考自:https://blog.csdn.net/liuzibujian/article/details/81086324?tdsourcetag=s_pcqq_aiomsg代码:void euler(int n){ phi[1]=1;///1要特判 for (int i=2;i<=n;i++) { if (flag[i]==0) { pri...原创 2019-07-09 12:31:08 · 471 阅读 · 0 评论 -
最小表示法
概念:用于求一个字符串所有循环同构中字典序最小那个串的开头的位置。何为循环同构?就是把字母一个个后移AABC的同构有,ABCABCAACAAB具体方法:两个指针i,j,表示当前字典序最小的开头。初始i=0,j=1,我们对这两个串字符逐个比较直到不同,假设只相同了同k位如果s[(i+k)%len] < s[(j+k)%len] ,那么我们确定i开头更...原创 2019-07-06 23:31:56 · 111 阅读 · 0 评论 -
板子合集,持续更新中...
树上倍增求LCAconst int N = 1e5+5;int lca[N][20];int dep[N];void dfs(int now,int f,int depth){///初始时dfs(根节点,0,1); lca[now][0] = f; dep[now] = depth; for (int i=head[now];i!=0;i=edge[i].las...原创 2019-07-17 10:06:51 · 503 阅读 · 0 评论 -
回文树功能
len[]:当前节点代表的回文串长度num[]:当前节点代表的回文后缀种类+1(自己)cnt[]:当前节点代表的回文串的数目p:当前节点总数①统计一个字符串本质不同回文串种类,统计每种回文串的数目(难度:*)p-2,cnt[]直接使用即可(cnt要先跑一遍回文树里的count函数,不然没有计入某些回文后缀包含当前节点回文串的数目)②统计每个前缀的最长回文后缀(难度:*)...原创 2019-08-03 16:40:40 · 114 阅读 · 0 评论 -
最low的哈希写法以及用哈希表去重
字符串hash写法:①构造对于一个串shash[1] = s[0]hash[2] = (hash[0]*P + s[1])%Q...hash[len] = (hash[len-2]*P+s[len-1])%Q这样构造即可.P取一个比最大字符ASCII码大一点的质数(311好像挺常用)Q取一个超大的质数(一般用unsigned long long自动对2^64-1...原创 2019-07-28 15:24:21 · 654 阅读 · 0 评论 -
字符串算法的一些总结
已学习最小表示法功能:1.O(N)求一个串的所有循环同构串中字典序 最小/最大 的那个串的起点在原串中的位置KMP功能:1.O(N)求每个前缀的最长相同前后缀2.O(N+M)进行模式串在匹配串中的查找3.O(N)判断当前字符串是否循环,若循环则len%(len-fail[len]) = 04.O(N)求当前字符串的最小循环节len-fail[len]不管当前是否...原创 2019-08-05 23:18:05 · 202 阅读 · 0 评论 -
AC自动机
参考博客:https://www.cnblogs.com/sclbgw7/p/9260756.html目录一、例题二、联系KMP思考AC自动机的构建三、AC自动机匹配时跳fail边的优化四、AC自动机对于单词节点计数时跳fail边的优化一、例题给出n个模式串,一个匹配串,询问有几个模式串出现在匹配串中二、联系KMP思考AC自动机的构建对于上面的问题我们如何用KM...原创 2019-08-06 19:00:32 · 131 阅读 · 0 评论 -
图论的一些基础算法的模板
Floyd 算法:作用:求任意两点最短路时间:O(V^3)#define for0(i,a,b) for (int i=a;i<b;i++)memset(dp,INF,sizeof dp);for0(i,0,n) dp[i][i] = 0;int u,v,w;for0(i,0,m){ scanf("%d %d %d",&u,&v,&w);...原创 2019-08-15 16:47:05 · 110 阅读 · 0 评论 -
Manacher算法(马拉车??)
(本文最后判断区间回文有改动,emm之前写错了,你这么聪明一定看出来了)该算法用于寻找当前串中最长的回文子串长度。为了避免误人子弟,也可以直接去看思路清晰,简单易懂的博客:https://blog.csdn.net/dyx404514/article/details/42061017这个大神写的各种算法的模板和讲解都很棒哦。①暴力找:我们选取一个点O,然后要考虑这个点作为回文串...原创 2019-07-09 12:04:58 · 200 阅读 · 0 评论