
模板
Absoler
这个作者很懒,什么都没留下…
展开
-
字符串算法汇总
字符串哈希:讲解大意就是将字符串视为一个多位的数,用unsigned long long 保存,溢出可以视为对2^64取模。回文树:博客另一篇博客推荐配合OIWiki上的图食用每个节点代表当前前缀的最大回文串后缀,next指向的是代表[通过前后加上一个新字符能得到的新回文串]的节点,suffix指向的是加入新字符后,该回文串的最大的回文后缀。有两个根,最终节点数...原创 2019-08-02 20:56:10 · 373 阅读 · 0 评论 -
HDU6230-Palindrome
题目连接题目大意:定义一种 one−and−halfone-and-halfone−and−half 回文串,其长度为 3n−23n-23n−2 ,满足 s[i]=s[2n−i]=s[2n−2+i],1≤i≤ns[i]=s[2n-i]=s[2n-2+i], 1 \leq i\leq ns[i]=s[2n−i]=s[2n−2+i],1≤i≤n 。输入一个长度为n (n≤5e5)(n\leq 5e5...原创 2019-11-19 21:25:36 · 130 阅读 · 0 评论 -
回文树模板
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=3e5+4;struct Palindromic_Tree{ int next[maxn][26]; int...原创 2019-10-22 00:08:35 · 110 阅读 · 0 评论 -
可持久化线段树
可持久化线段树可以用来解决这个经典问题:对于给定数字序列,求出 [l, r] 区间中第K大的数。我们首先考虑这样一棵线段树i,它的每个节点对应一段值域,记录了[1, i]区间中落在节点对应值域的点的个数。如果我们能有n棵这样的线段树,那么对于区间第K大问题就可以通过搜索(代表[l,r]区间中大小在i对应值域中点的个数)来解决。比如如果左区间的量为res小于k,那么就继续在右区间找第...原创 2019-10-18 00:59:58 · 167 阅读 · 0 评论 -
数位DP的一点心得
众所周知,DP算法用于解决拥有最优子结构或者可记忆化搜索的问题。数位DP一般属于后者。对于HDU2089这样的经典问题,我们可以看到,如果从0到1000000一个数字一个数字地去判断是否合法,会造成很多计算的浪费,譬如0~999这个区间有多少合法的值,其实是可以复用的。我们因此引入记忆化搜索来解决这个问题。dp[pos][state]; //int dp[6][2];表示在0~...原创 2019-10-12 20:40:34 · 140 阅读 · 0 评论 -
线段树RMQ(MAX)模板
线段树求区间最大模板原创 2019-07-25 22:50:29 · 299 阅读 · 1 评论 -
后缀数组模板
const int N=2e4+10;int n,sa[N],rnk[N],height[N];char s[N];//sa数组表示字典序为i的后缀是谁,rnk数组表示某个后缀的排名void buildSA(int m=128){ int cnt[N],rnk1[N],rnk2[N],tmpSA[N]; //cnt[i]用来记录rnk小于等于i的子串已经有多少个了,这样可...原创 2019-08-08 20:42:16 · 221 阅读 · 0 评论 -
扫描线+离散化+线段树HDU1255&POJ1177
首先我们要对扫描线算法建立一个形象的认识,可以参考链接。大概就是,对于某个由多个矩形覆盖重叠形成的不规则几何体的面积,可以转化为从下往上一系列小矩形,有点像垒砖,层数为线段数-1,也就是矩形数*2-1。在这个算法里,线段树维护整个区间被覆盖的,有效的“长”,它是由一小段一小段的线段组成,我们对于每条线段添加一个flag成员变量,当该线段被某矩形的下边包含,该线段flag+1,上边则-1。如果该...原创 2019-08-28 21:06:38 · 175 阅读 · 0 评论 -
最小路径覆盖(匈牙利算法)
最小路径算法解决以下问题:对于一个DAG,找到最少的路径,覆盖所有顶点。按路径可否相交分为两类。首先是路径不相交的最小覆盖:我们可以把每个顶点分为出点和入点,这时每种路径安排都是一个二分图P',问题转化为了求该二分图的最大匹配:如果在P'中增加一条匹配边pi'-->pj',那么在图P的路径覆盖中就存在一条由pi连接pj的边,也就是说pi与pj 在一条路径上,于是路径覆盖数就可以减少一...原创 2019-10-06 15:54:36 · 1007 阅读 · 0 评论