上一页 1 2 3 4 5 6 7 8 ··· 29 下一页
该文被密码保护。 阅读全文
posted @ 2019-03-04 22:43 lokiii 阅读(8) 评论(0) 推荐(0) 编辑
摘要: 把三个串加上ASCII大于z的分隔符连起来,然后求SA 显然每个相同子串都是一个后缀的前缀,所以枚举s1的每个后缀的最长和s2相同的前缀串(直接在排序后的数组里挨个找,最近的两个分别属于s1和s2的后缀的height一定是最长符合要求的前缀),然后判断一下这个子串里最早出现的和s3相同的子串的位置, 阅读全文
posted @ 2019-03-03 20:27 lokiii 阅读(112) 评论(0) 推荐(0) 编辑
摘要: 圆方树不仅能解决仙人掌问题(虽然我仙人掌问题也没用过圆方树都是瞎搞过去的),还可以解决一般图的问题 一般图问题在于缩完环不是一棵树,所以就缩点双(包括双向边) 每个方点存他所在点双内除根以外的点的最小权值,这样的好处是更新原点的时候不用更新它一圈的方点,只更新父亲即可 树剖维护,然后查的时候如果lc 阅读全文
posted @ 2019-02-28 21:26 lokiii 阅读(159) 评论(0) 推荐(0) 编辑
摘要: 本来想先求出点双再一个一个处理结果写了很长发现太麻烦 设f[u]为u点向下的最长链 就是再tarjan的过程中,先照常处理,用最长儿子链和次长儿子链更新按ans,然后处理以这个点为根的环,也就是这个点是dfs第一次到这个环访问到的点 环用来更新ans的是儿子链+到根的一段,这个直接for一边就行,还 阅读全文
posted @ 2019-02-28 11:56 lokiii 阅读(146) 评论(0) 推荐(0) 编辑
摘要: 参考:https://www.cnblogs.com/clrs97/p/7518696.html 其实和圆方树没什么关系 设f[i][j][k]为i点选/不选,这个环的底选不选 这个底的定义是设u为这个环在dfs中第一个被扫到的点,箭头表示dfs序: cpp include include usin 阅读全文
posted @ 2019-02-27 08:36 lokiii 阅读(193) 评论(0) 推荐(0) 编辑
摘要: 先求SA,然后按字典序从小到大枚举子串,每到一个后缀从长到短枚举子串(跳过长为he[i]的和前一段重复的子串),然后维护一个点p,保证i~p之间最小的he =当前枚举长度,p是单调向右移的 然后把每个后缀的结果倒着输出即可 阅读全文
posted @ 2019-02-26 17:07 lokiii 阅读(97) 评论(0) 推荐(0) 编辑
摘要: 总是犯低级错误,st表都能写错…… 正反分别做一遍SA,预处理st表方便查询lcp,然后处理a[i]表示前i个后缀一共有多少个本质不同的子串,这里的子串是按字典序的,所以询问的时候直接在a上二分排名就能得到询问区间,然后用正反st表查lcp即可 cpp include include include 阅读全文
posted @ 2019-02-26 11:36 lokiii 阅读(151) 评论(0) 推荐(0) 编辑
摘要: 一眼AC自动机,就是先把串建一个自动机,标记每个串在自动机上的位置,然后加上间隔符连成一个串在自动机上跑,每跑到一个点就说明这个串以及它到root的所有点表示的串都要被更新一次 先在点上打上标记,最后dfs fail数向上传递 并不是到结尾点才能更新……脑子抽了 cpp include includ 阅读全文
posted @ 2019-02-25 22:01 lokiii 阅读(109) 评论(0) 推荐(0) 编辑
该文被密码保护。 阅读全文
posted @ 2019-02-25 16:32 lokiii 阅读(5) 评论(0) 推荐(0) 编辑
摘要: 考虑静态怎么做:枚举右边界,然后枚举上边界,对应的下边界一定单调不降,单调栈维护每一列从当前枚举的右边界向左最长空位的长度,这样是O(nm)的 注意到n =m,所以m include using namespace std; const int N=4000005; int n,m,Q,len[N' 阅读全文
posted @ 2019-02-23 15:47 lokiii 阅读(285) 评论(0) 推荐(0) 编辑
该文被密码保护。 阅读全文
posted @ 2019-02-14 18:02 lokiii 阅读(4) 评论(0) 推荐(0) 编辑
摘要: 用SA求出height数组,然后发现每个height值都有一个贡献区间(因为点对之间要依次取min) 用单调栈处理出区间,第一问就做完了 然后用并查集维护每个点的贡献(?),从大到小枚举height,因为这样区间是不断增大的所以并查集合并即可 cpp include include include 阅读全文
posted @ 2019-02-01 23:13 lokiii 阅读(110) 评论(0) 推荐(0) 编辑
摘要: 参考:https://www.cnblogs.com/2016gdgzoi509/p/8999460.html 列出生成函数方程,g(x)是价值x的个数 $$ f(x)=g(x) f^2(x)+1 $$ +1是f[0]=1 根据公式解出 $$ f(x)=\frac{1+( )\sqrt{1 4 g( 阅读全文
posted @ 2019-01-19 10:34 lokiii 阅读(133) 评论(0) 推荐(0) 编辑
该文被密码保护。 阅读全文
posted @ 2019-01-18 09:22 lokiii 阅读(3) 评论(0) 推荐(0) 编辑
摘要: 并不会递推,不过板子挺好背的,只要是类似的递推都能用,但是注意c数组不能使负数 如果除了递推还有常数项的话,就用f[i] f[i 1]的方式消掉常数项(然后多一个f[i 1]的项) cpp include include include include using namespace std; co 阅读全文
posted @ 2019-01-16 11:04 lokiii 阅读(135) 评论(0) 推荐(0) 编辑
该文被密码保护。 阅读全文
posted @ 2019-01-16 10:32 lokiii 阅读(9) 评论(0) 推荐(0) 编辑
该文被密码保护。 阅读全文
posted @ 2019-01-12 22:08 lokiii 阅读(9) 评论(0) 推荐(0) 编辑
该文被密码保护。 阅读全文
posted @ 2019-01-11 22:14 lokiii 阅读(6) 评论(0) 推荐(0) 编辑
该文被密码保护。 阅读全文
posted @ 2019-01-10 22:02 lokiii 阅读(6) 评论(0) 推荐(0) 编辑
摘要: 一开始设计了四种状态,多了一种已经拐弯但是长度为0的情况,后来发现不用,设012表示没插头,没拐弯的插头,拐了弯的插头,然后转移的话12,21,22都不合法,剩下的转移脑补一下即可,ans只能在11,02,20取,别的都不是合法结束状态 阅读全文
posted @ 2019-01-04 08:02 lokiii 阅读(98) 评论(0) 推荐(0) 编辑
该文被密码保护。 阅读全文
posted @ 2018-12-20 20:13 lokiii 阅读(3) 评论(0) 推荐(0) 编辑
摘要: 要判边界!!要判边界!!要判边界!!if(j!=m)!!! 我真是zz横着转移要判断到底能不能向右边出边…… 然后剩下的和1814差不多,九十因为不要求经过所有格子,所以左右括号随时可以合并,但是注意合并的时候轮廓线上不能有别的括号,然后还有是(0,0)可以转移到(0,0),相当一不经过这个格子 阅读全文
posted @ 2018-12-14 21:57 lokiii 阅读(136) 评论(0) 推荐(0) 编辑
摘要: 设f[i][j][s]为轮廓线推到格子(i,j),状态为s的方案数 括号表示一段线的左端和右端,表示成左括号和右括号,状压的时候用1和2表示,0表示已经闭合 下面的蓝线是黄色格子的轮廓线,dp转移要把它转到橙色轮廓线,设已经在状压的s中取到两条边的状态记为b1,b2 然后分很多情况讨论: (i,j) 阅读全文
posted @ 2018-12-14 08:44 lokiii 阅读(188) 评论(0) 推荐(0) 编辑
摘要: 统计在一个root下的两个子树,每个子树都和前面的运算一下再加进去对于这种需要排序的运算很麻烦,所以考虑先不去同子树内点对的算出合法点对个数,然后减去每一棵子树内的合法点对(它们实际上是不合法的,相当于一个容斥) 算点对用排序+双指针即可 cpp include include include us 阅读全文
posted @ 2018-12-11 21:43 lokiii 阅读(169) 评论(0) 推荐(0) 编辑
摘要: 点分治,用一个mn[v]数组记录当前root下长为v的链的最小深度,每次新加一个儿子的时候都在原来儿子更新过的mn数组里更新ans(也就是查一下mn[m dis[p]]+de[p]) 这里注意更新和初始化的时候不能对整个mn操作,这样时间复杂度是错的,要开一个栈存一下更新了哪些点,只初始化这些点即可 阅读全文
posted @ 2018-12-11 18:38 lokiii 阅读(110) 评论(0) 推荐(0) 编辑
摘要: 点分治,设当前处理的块的重心为rt,预处理出每个子树中f[v][0/1]表示组合出、没组合出一对值v的链数(从当前儿子出发的链),能组合出一对v值就是可以有一个休息点 然后对于rt,经过rt且合法的路径是两边拼起来至少有一个休息点的路径,每次假如新儿子都和之前的儿子组合一遍即可,注意f[0][0]实 阅读全文
posted @ 2018-12-11 16:32 lokiii 阅读(148) 评论(0) 推荐(0) 编辑
摘要: 和3053差不多,把pair first做成负数就可以用大根堆维护了 注意:要开long long;比较的时候因为编号也占权重所以要比较pair;编号不是mid!不是mid!是初始输入的那个编号!~~搞混调了很久~~ cpp include include include include inclu 阅读全文
posted @ 2018-12-11 09:06 lokiii 阅读(162) 评论(0) 推荐(0) 编辑
摘要: 多维KDtree板子 左右儿子的估价用mn~mx当区间,假设区间里的数都存在;k维轮着做割点 cpp include include include include include include using namespace std; const int N=50005; int n,k,m,r 阅读全文
posted @ 2018-12-10 20:41 lokiii 阅读(144) 评论(0) 推荐(0) 编辑
摘要: 其实理论上cdq更优 核心是依次取x值、y值的mid作为当前节点,向两边递归建立二叉树,树上维护size:子树大小;mx[0/1]:子树内最大x/y;mn[0/1]:子树内最小x/y;d[0/1]:这个点的x/y; 建树的时候用到nth_element,用处是把第k个数放到k位置,并且把小于k的放在 阅读全文
posted @ 2018-12-10 19:04 lokiii 阅读(146) 评论(0) 推荐(0) 编辑
摘要: 不太清楚是不是动态dp……? 这个维护其实和最大连续子段差不多,维护l[x][y],r[x][y],m[x][y]分别表示包含左儿子的01个数为(x,y)的区间个数,包含右儿子的01个数为(x,y)的区间个数,和01个数为(x,y)的所有区间个数 x表示1的个数情况,0表示0个,1表示1个,2表示 阅读全文
posted @ 2018-12-10 07:57 lokiii 阅读(336) 评论(1) 推荐(1) 编辑
上一页 1 2 3 4 5 6 7 8 ··· 29 下一页