----后缀自动机
文章平均质量分 67
扩展的灰
扩展的灰(Extended Ash)
展开
-
Jzoj1309 最长二重串
给你一个字符串,要你求出最长的至少出现两次的子串这个题呢,很明显是SA啦 是SAM的裸题!帅气简介高大上的SAM出现啦(比难看的SA好到不知道哪里去了)#include#include#include#define N 400010using namespace std;char str[N];int s[N][26],mx[N],f[N],sz[N];原创 2017-09-19 21:55:55 · 539 阅读 · 0 评论 -
Jzoj3756 【NOI2014】动物园
下课前,园长提出了一个问题:“KMP 算法只能求出 next 数组。我现在希望求出一个更强大 num 数组——对于字符串 S 的前 i 个字符构成的子串,既是它的后缀同时又是它的前缀,并且该后缀与该前缀不重叠,将这种字符串的数量记作num[i]。例如 S 为 aaaaa,则 num[4] = 2。这是因为 S 的前 4 个字符为 aaaa,其中a 和 aa 都满足性质‘既是后缀又是前缀’,同时保证原创 2017-12-04 20:35:14 · 418 阅读 · 0 评论 -
Jzoj3654 【APIO2014】回文串
题意:求出现次数*长度最大的回文串很水的一道题直接用回文树可以切了太菜并不会回文树,用了极慢的sam+manachermanacher求出所有回文子串用sam在parent树上面倍增就可以求出一个串的出现次数,manacher是O(n)的,倍增lgn,整体复杂度nlgn(分开的manacher比什么插入特殊符号的好写多了)#include#include#include原创 2017-10-21 20:24:55 · 440 阅读 · 0 评论 -
Poj2774 Long Long Message
题目传送门题意:求两个字符串的LCS这个题是SA的经典题,也是SAM的经典题SA做法:连接两个字符串(中间加个#)让后求height,Answer=Max{height[i]}SAM做法:从开头匹配字符串,如果当前节点x能继续匹配就继续如果不能匹配,就令x=f[x]直到x为根或者可以继续匹配,这样显然是正确的,因为f[x]显然是x的后缀#include#includ原创 2017-11-27 20:06:56 · 328 阅读 · 0 评论 -
Poj1743 Musical Theme
题目传送门题意:对一个序列的差分求出现至少两次且两次不相交的最长子串也是SA和SAM都可以做,SA稍微麻烦SA做法:二分+height分段rmqSAM做法(太神了):对于每个节点的right集合,求出其中的最大值和最小值那么合法的长度一定为min(mx[x],r[x]-l[x])(l和r分别是最大值和最小值)#pragma GCC opitmize("O3")#pra原创 2017-11-27 20:41:08 · 251 阅读 · 0 评论 -
后缀自动机转后缀树模板
终于找到教程了,现在来写一发题目:Jzoj4072(bzoj3998)弦论 第一问其实非常好写,连空间都不需要多开一倍,只需要sa数组rank数组和height数组就好了,dfs一次可以求出#include#include#include#include#define N 1000010using namespace std;char str[N]; long原创 2018-01-12 19:38:00 · 485 阅读 · 2 评论 -
51Nod1469 淋漓尽致子串
首先,我们来定义一下淋漓尽致子串。1.令原串为S。2.设子串的长度为len,在原串S中出现的次数为k,令其出现的位置为p1, p2, ....pk(即这个子串在原串中[pi,pi + len - 1]中出现)。3.若k=1,则该子串不是淋漓尽致子串。4.若存在pi,pj(i != j),使得S[pi - 1] = S[pj - 1],则该子串不是淋漓尽致子串。5.若存在pi原创 2018-02-07 09:27:26 · 268 阅读 · 0 评论 -
Jzoj5665 奥立卡的诗
终于又遇到SAM的题了好好玩,而且就这道题让我弄清楚了广义SAM和Trie上SAM的区别其实两者是没有多少区别的,不过Trie上SAM可以更快关于Trie上SAM,是用bfs的方法来构建的,相比起广义SAM用dfs建少了一个深度之和的部分但是如果原题给的就是Trie那么就只能用bfs了,因为dfs会被卡成O(n^2) (考虑一个扫把)回到本题,简化一下式子发现这道题求的是不同子串的原创 2018-04-20 21:18:25 · 262 阅读 · 0 评论 -
字符串专题1
.都是些bzoj原题辣,这几天刚做的 Bzoj4032有趣的dp题,也要用到各种自动机注意到题目的两个关键词“子串”和“子序列”考虑对A和B串建立后缀自动机和序列自动机序列自动机:可以识别一个序列所有子序列的自动机 想必学过自动机的各位都知道这个玩意怎么建,这里不再阐述让后我们考虑这些询问询问1:直接用SAM做类似LCS的做法求出A每个前缀和B匹配的最长距离,取最小+1询问2:...原创 2018-11-19 22:06:20 · 259 阅读 · 0 评论 -
字符串专题讲解
最近教练叫我去讲字符串专题,于是来写一写这方面的内容主要就讲以下几个吧:1.Kmp 2.Extended Kmp3.Trie4.AC Automation5.String Hash6.Suffix Array7.Suffix Automation8.Suffix Tree9.manacher10.Palindrome Automation11.Suf原创 2017-11-26 16:03:44 · 992 阅读 · 10 评论 -
Bzoj3998 弦论
物理题目传送门求第k大的子串?SAM模板题啊CLJ的论文都讲了怎么做啊,把自动机看成一个后缀Trie求出size让后像多叉平衡树那样乱搞就好了~比前两个哈希的题好多了~ (顺便,hdu高亮好好看啊)#pragma GCC opitmize("O3")#pragma G++ opitmize("O3")#include#include#include#define N原创 2017-12-01 20:48:26 · 254 阅读 · 0 评论 -
Jzoj4384 Hashit
你有一个字符串S,最开始为空,要求支持两种操作在S后面加入字符c删除S最后一个字符每次操作询问S有多少个两两不同子串应该本来应该用SAM+Trie离线做的,然而为了练一下后缀平衡树就写了其实也很好写,用哈希比较一下就好了,可以用set实现,开一个数组存每个后缀对应的节点就好求height也可以用哈希#pragma GCC opitmize("O3")#pragma原创 2017-12-10 13:15:51 · 495 阅读 · 0 评论 -
Jzoj2921【NOI2012模拟题】字符串识别
神(shui)题,AC后看了下别人的code发现全都是后缀数组(难看)可能是因为我太弱了所以只想到SAM的算法做法:建立SAM,求出parent树,预处理倍增,让后就可以O(lg n)查询一个字串的出现次数了接下来,我们对于每个l∈[1,n],我们求出一个最小的r使得[l,r]在整个串里面只出现一次那么对于每个点i,ans[i]有两种情况:1.i被一个最短的区间[lj,原创 2017-09-20 20:54:46 · 400 阅读 · 0 评论 -
Jzoj4439 不是回文串
我倒是觉得上面那一问难一点呢。。。。下面一个SAM就没掉了,上面还要加上倍增和马拉车size为right集合大小,mx为最大长度,跑出parent树,OK搞定#include#include#include#define N 2000010using namespace std;char str[N]; long long A=0;int s[N][26],sz[N],原创 2017-10-06 20:41:26 · 301 阅读 · 2 评论 -
Jzoj4734 恶魔
其实就是在求有几对完全相等子串满足长度小于等于k而已很明显打一个sam就好了,条件就是mx[f[p]]#include#include#include#define N 200010 using namespace std;char str[N]; long long A=0;int s[N][26],mx[N],f[N],sz[N];int n,k,cnt=1,lst=原创 2017-10-21 22:00:17 · 287 阅读 · 0 评论 -
Jzoj5462【NOIP2017提高A组冲刺11.8】好文章
nodgd写了一篇文章,自认为这是一篇好文章。nodgd的文章由原创 2017-11-08 15:39:47 · 711 阅读 · 0 评论 -
Jzoj4876 基因突变(红警系列)
邪恶的707刚刚从白垩纪穿越回来,心中产生了一个念头:我要统治人类! 但是统治人类是很庞大且复杂的一个工程,707尝试了洗脑,催眠,以及武装镇压都没能成功地统治人类,于是她决定从科学上对人类的基因进行研究从而达到他的目的。 707获取了人类的基因信息并尝试对基因进行实验。他发现可以把人类的基因看做一个只包含小写字母的字符串,并定义从头开始任意长度的基因为“源头基因”人类身上与源原创 2017-10-31 08:10:28 · 1330 阅读 · 0 评论 -
一些基础算法的模板(持续更新)
更新中//Templates From Extended_Ash/Cooevjnz/JacaJava/Tubbcrafft//To be continued...//Suffix Automationchar str[N]; int s[N][26],mx[N],f[N],sz[N]; int last=1,cnt=1,n,v[N],r[N],ans=0; inlin原创 2017-10-25 22:05:58 · 3734 阅读 · 0 评论 -
Poj3261 Milk Patterns
题目传送门题意:对一个字符串求一个最长的子串使得它至少出现k次额,因为这个题目呢,他的字符集非常大(100W)所以直接用SAM是不行了,我们考虑用离散化+SA,让后就可以分块rmq了当然这样很麻烦,我们还是用SAM,但是儿子集合用map来存,这样空间就是O(n)的,时间多了一个log#pragma GCC opitmize("O3")#pragma G++ opitmiz原创 2017-11-27 21:06:50 · 276 阅读 · 0 评论 -
Poj3294 Life Forms
题目传送门哈哈哈广义SAM真的好简(du)单(liu)啊到时候讲课可以拿来祸害众生,Yeah!好了开始讲题解,我们将所有字符串加入广义SAM里面对每一个节点维护一个bitset表示它在哪些主串中出现过,让后标记上传就用或运算就好了因为题目要求输出方案,加上一个dfs就可以了,复杂度O(L*n/64)(其实题目本质就是parent树上每个节点为一个集合,求一个子树的并的大小而原创 2017-11-30 17:34:32 · 416 阅读 · 0 评论 -
Bzoj2434 阿狸的打字机
纪念一次AC,水一篇blog又是喜闻乐见的广义SAM题辣题意:给一个trie,每次问询一个串在另一个串出现的次数思路:建立广义SAM,离线所有询问,每次讲一个主串在fail树上的节点+1,处理询问就用fenwick维护子树和这里注意,1.广义SAM要用bfs建2.每次从一个主串到下一个时,不要整个都减掉而是要在LCA处会和,这样复杂度就是对的代码有点长但是很好打#include&...原创 2018-11-26 21:12:32 · 261 阅读 · 0 评论