摘要:
AC自动机是Trie树与KMP思想的结合。用于多模式串匹配。 和KMP一样,它的原理就是:对所有模式串建一个Trie。任意一个串扔进去,得到的就是在Trie树上最长能匹配的后缀,我们把文本串的每个前缀依次加进去(前缀的后缀就是子串),就能得到模式串与文本串的关系了。 考虑到怎么实现这个功能:和KMP 阅读全文
摘要:
KMP算法用来求单模式串匹配。 简单来说,你需要给你的模式串计算一个 \(nxt\) 数组,使得 \(nxt[i]\) 是长度为 \(i\) 时的最长公共前后缀。 匹配到文本串的一个位置 \(i\) 时,相当于把文本串长度为 \(i\) 的前缀拿出来,找它的最长后缀(前缀的后缀即是子串)使得能与模式 阅读全文
摘要:
模板,代码如下: #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> using namespace std; const int N=1000009; char s1[N],s2[N]; int nxt 阅读全文
摘要:
整体二分也是一种非常妙的分治算法。 大致流程: 记$solve(l,r,x,y)\(表示\)[x,y]\(这些询问,他们的答案范围在\)[l,r]$内,并设$mid$ 为$[l,r]$的中点 我们先把$[l,mid]\(内的影响计算,再对每个询问:若此询问已经满足要求,则他们所属答案区间为\)[l, 阅读全文
摘要:
此题可以使用整体二分解决。 我们发现把所有国家收集陨石的情况都查一遍的总复杂度是固定的,那么这时候我们就可以放心的使用整体二分: 记$solve(l,r,x,y)\(表示\)[x,y]\(这些国家,他们的答案范围在\)[l,r]$内,并设$mid$ 为$[l,r]$的中点 我们先把$[l,mid]\ 阅读全文
摘要:
这题因为一些弱智错误调了好久。。。 考虑如何判断一个数是否是一堆数的中位数(不经过排序):记你想要判断的数为$mid$,然后把 \(\geq mid\) 的数设为$1$, \(\leq mid\) 的数设为$-1$,然后给这些数求个和,若$sum<0$,则 \(mid\) 比真正的中位数大,反之则比 阅读全文
摘要:
操作过程在那里写的非常清楚了,这里主要粘一下代码: #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> using namespace std; typedef long long LL; const i 阅读全文
摘要:
我学习的时候看的blog 珂朵莉树(又称ODT,Old Driver Tree),可以用来解决一类有区间赋值并且数据随机的问题。 其实ODT就是两个主要函数($Assign$和$Split$ 操作),时间复杂度的保证其实也都来源于此,其他所有的操作都是直接暴力解决。特别要注意的是,此题一定要有区间整 阅读全文
摘要:
线段树分治真的难写。 二分图判定的条件是图中不存在奇环。我们可以用带权并查集来维护。现在的难点就在于对线段树$DFS$时回溯的时候如何删除影响。 这里可以使用可删并查集:注意到我们加入影响和删除影响的过程就是维护栈的过程,我们可以放弃并查集的路径压缩(我们按秩合并也可以保证复杂度),并在加入边时记录 阅读全文
摘要:
普通线段树 普通的线段树先不谈,我们来看一点比较高级的科技。 直接给一些好题: luogu CF446C DZY Loves Fibonacci Numbers 题解 线段树分治 啊啊啊今天突然发现全机房只有我不会线段树分治。。。 有时我们会在时间轴上进行一些操作,或者清除我们之前的操作。这时候我们 阅读全文