05 2019 档案
摘要:"题目链接" 其实这东西很好懂的。。用来维护一次函数。 每个结点存一个值,表示x=这个区间的mid时值最大的函数的编号。 把插入线段的斜率和当前结点的斜率和大小比较来更新左右儿子的值。 查询是实际上是查询从根到这个叶节点链上的最大值。。 cpp include include using names
阅读全文
摘要:"题目链接" 手写一下AC自动机(我可没说我之前不是手写的) Trie上dp,每个点的贡献加上所有是他后缀的串的贡献,也就是这个点到根的fail链的和。 cpp include include include include using namespace std; const int MAXK =
阅读全文
摘要:"题目链接" 首先想到状压dp,但是n,m高达100,怎么压? 容易发现,每行每列最多两个象棋,否则就直接gg了。 一个巧妙的设置状态的方式是,只需要记录到当前行有多少列是放了1个炮和2个炮。 然后每一行有3种选择:不放、放1个、放2个。分情况转移就行了。 cpp include const i
阅读全文
摘要:"题目链接" f[i][j]表示准考证号到第i位,不吉利数字匹配到第j位的方案数。 答案显然是\sum_{i=0}^{m 1}f[n][i] f[i][j]=\sum_{k=1}^{m 1}f[i 1][k] g[k][j] g[i][j]表示不吉利数字匹配到第i位后加一
阅读全文
摘要:"题目链接" AC自动机上dp第一题嗷。 如果直接求可读文本的数量,显然要容斥,不好搞。 于是考虑求不可读文本的数量,再用26^m减去其即可。 建出AC自动机,如果一个节点为单词结尾或其fail链中有节点为单词结尾,那么这个点就不能走,这个显然可以在bfs的时候顺便求出来。 然后就是大家熟知的方
阅读全文
摘要:"题目链接" 这么多字符串,肯定是自动机啦。 先建出AC自动机,然后怎么表示一个安全代码没有病毒代码呢? 就是存在一条路径不经过有病毒代码段结尾的节点呗。 所以呢?有环啊!dfs一下救星了。 cpp include include include include using namespace st
阅读全文
摘要:把单词连起来,中间插入间隔符, "同" cpp include include include using namespace std; struct Node{ int fail, next[27], num; }AC[200010]; int n, u, cnt; queue q; int p[
阅读全文
摘要:每次匹配都不停跳fail显然太慢了,于是在每个节点和fail指向的点连一条边,构成一棵树,在这棵树上差分一下就好了。 AC自动机 就这个算法而言其实没用想象中那么难。 cpp include include include using namespace std; struct Node{ int
阅读全文
摘要:"题目链接" 马拉车+简单膜你 cpp include include include using namespace std; const int MAXN = 11000010; const int MOD = 19930726; char b[MAXN], a[MAXN = 1; } retu
阅读全文
摘要:"题目链接" 启发式合并就是~~暴力合并~~把小的合并到大的里,一个一个插进去。 并查集维护连通性,同时保证并查集的根就是所在Splay的根,这样能省去很多操作。 cpp include include using namespace std; inline int read(){ int s =
阅读全文