51nod 小Z的trie(Trie+广义SAM)】的更多相关文章

传送门 树上的任意一条路径一定会在以某一个叶子节点为根的树上成为一条直上直下的链,而总共只有\(20\)个叶子节点. 于是每一次选所有叶子节点中的一个作为根,形成一个\(Trie\),把\(20\)个\(Trie\)统一到一个\(Trie\)上,然后对这个总的\(Trie\)建立广义后缀自动机,最后统计一下广义SAM每个节点代表的字符串个数求和. 在\(Trie\)上BFS建立广义SAM可以做到\(O(20NA)\)的复杂度,把\(20\)个\(Trie\)直接一个个插入SAM在线建会多一个\(…
[题目链接] http://www.51nod.com/contest/problem.html#!problemId=1647 [题意] 给定一个n个字符串的Trie,每次询问一个字符串在Trie上的出现次数. [思路] 将n个字符串构造一个Trie,构造广义后缀自动机,识别Trie中的所有子串. 则问题转化为求子串[l,r]在所属字符串中的出现次数,和 这道题 类似,采用树上倍增得到|right|的方法. 比较恶心的是定位字符串的位置=-=. [代码] #include<set> #inc…
题面 传送门 题解 后缀平衡树是个啥啊我不会啊-- 那么我们来考虑一下\(SAM\)的做法好了 不难发现它的本义是要我们维护一棵\(trie\)树,并求出\(trie\)树上每一个节点到根的这段串的不同子串个数,而显然一个串的不同子串个数就是它的\(SAM\)上每一个节点的\(len[p]-len[fa[p]]\)之和 那么我们对这个\(trie\)建一个广义\(SAM\),这个\(SAM\)一定包含每一个路径的\(SAM\) 我们对每一个这棵\(trie\)上的每一个节点记录一个\(pos\)…
关于SAM和广义SAM 不是教程 某些思考先记下来 SAM 终于学会了这个东西诶...... 一部分重要性质 确定一个重要事情,S构造出的SAM的一个重要性质是当且仅当对于S的任意一个后缀,可以从1号节点走到终止状态.专业的名词叫做有限状态自动机. trans[st][c]表示的是对于状态st,如果将st中任意串s加一个c,那么会到达的新状态new,显然new是唯一的.假如不唯一那么s一定不属于同一个st. fa[st]表示的是对于状态st,如果慢慢缩小st中后缀长度,会到达的第一个状态.规定一…
3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 974  Solved: 573 Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看.幽香当然也非常高兴啦.  这时幽香发现了一件非常有趣的事情,太阳花田有n块空地.在过去,幽香为了方便,在这n块空地之间修…
所有题目开启-O2优化,开大栈空间,评测机效率为4亿左右. T1 小 Z 学数学(math) Description ​ 要说小 Z 最不擅长的学科,那一定就是数学了.这不,他最近正在学习加法运算.老师为了考核小 Z,给他出了一个问题. ​ 给定一个操作序列,每个操作形如 t a .如果 t 是 0,那么意味着加上 a:如果 t 是 1,那么意味着改成 a.那么问题来了,给定一开始有一个数字 0,按照从左到右的顺序执行操作序列中[l,r]段的操作,最后得到的数字是什么?为了确定小 Z 已经掌握了…
首先,让每一个叶节点做一次树根的话,每个路径一定至少有一次会变成直上直下的 于是对于每个叶节点作为根产生的20个trie树,把它们建到同一个广义SAM里 建法是对每个trie dfs去建,last就是父亲的那个节点:每次做一个新trie时,last给成root 然后答案就是每个节点表示的长度和 #include<bits/stdc++.h> #define pa pair<int,int> #define CLR(a,x) memset(a,x,sizeof(a)) #define…
Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看.幽香当然也非常高兴啦.  这时幽香发现了一件非常有趣的事情,太阳花田有n块空地.在过去,幽香为了方便,在这n块空地之间修建了n-1条边将它们连通起来.也就是说,这n块空地形成了一个树的结构.  有n个粉丝们来到了太阳花田上.为了表达对幽香生日的祝贺,他们选择了c中颜色的衣服,每种颜色恰好可以用一个0…
正题 题目链接:https://www.ybtoj.com.cn/problem/532 题目大意 给出\(n\)个点的一个\(Trie\)树,定义\(S_x\)表示节点\(x\)代表的字符串 求$$max{|LCP(S_x,S_y)|+|LCS(S_x,S_y)|}(x\neq y)$$ (\(LCP/LCS\)分别表示最长公共前/后缀) \(1\leq n\leq 2\times 10^5\) 解题思路 正解好像是树上\(SA\)+线段树合并的做法可是我不会,就写了广义\(SAM\) \(S…
参考 还有首先你要会SAM吧~ 用途 相比与单串SAM,广义自动机能存储的是多个字符串. 有两种写法,第一种是离线利用trie树结构,第二种是在线伪广义SAM 离线+Trie 首先构建出trie树. 然后在trie树上BFS(),用\(pos[u]\)映射trie树上\(u\)节点对应SAM上的节点. 为什么不dfs,因为时间复杂度是trie树上所有叶子到根的距离和,证明BFS\(O(n)\)复杂度具体见上面参考博客. code: struct SAM { int tr[N<<1][M],nd…