后缀自动机
overcastt
这个作者很懒,什么都没留下…
展开
-
后缀自动机应用及例题
后缀自动机…真的好难啊……. 想学的可以看陈立杰课件……以及众多题解 题目 题目 1. 洛谷P3804【模板】后缀自动机 2.spoj1811 LCS 3.spoj1812 LCS2 1. 洛谷P3804【模板】后缀自动机 题意:求字符串 S 中所有出现次数不为 1 的子串的出现次数乘上该子串长度的最大值。 做法:建立SAM,令叶子节点 size 等于 1...原创 2018-06-17 22:43:41 · 2276 阅读 · 0 评论 -
bzoj4516/洛谷P4070 [Sdoi2016]生成魔咒 (后缀自动机)
bzoj4516/洛谷P4070 [Sdoi2016]生成魔咒 题意:求每加进来一个数以后会有多少个不同的子串 方法:每加进来一个数,我们就考虑以它为结尾会有多少个就可以了,显然fa[p]之前都会加完了,所以新产生的就是mx[p]−mx[fa[p]]mx[p]−mx[fa[p]]mx[p]-mx[fa[p]] 数会很大,所有用map记录就好 #include <cstdio>...原创 2018-06-16 19:28:47 · 288 阅读 · 0 评论 -
bzoj4566/洛谷3181 [Haoi2016]找相同字符] (后缀自动机+dp)
bzoj4566/洛谷3181 [Haoi2016]找相同字符 题意:求两个字符串中各取除一个串使他们相同的方案数 方法:显然,把第一个串建SAM,第二个串在上面跑匹配。 那么个数怎么计算呢,一般来说,我们求size表示它的个数,而这道题,我们需要的使前面的个数和而非后面的。 那么每个点的贡献怎么求呢,这个点已经能匹配上了,那么它的父节点也是可以的,所有结果是f[fa[p]]+size[p...原创 2018-06-16 01:07:48 · 356 阅读 · 0 评论 -
bzoj2555 SubString (后缀自动机+LCT)
8.bzoj2555 SubString 题意:两个操作:在原来的字符串后面加上一个新的字符串;查询一个字符串出现了几次 方法:假如没有假如新字符串的要求,就是模板了。 那么考虑加上新字符串会有什么影响,假如新的字符串以后,有的fa就会改变,而其他的是不会变的。 因此考虑LCT维护。每次连边,link(p,fa[p])link(p,fa[p])link(p,fa[p]),那么fa[p]到根...原创 2018-06-15 10:02:35 · 226 阅读 · 0 评论 -
bzoj3998/洛谷3975 [TJOI2015]弦论 (后缀自动机)
bzoj3998/洛谷3975 [TJOI2015]弦论 题意:求第 k 小字串 方法:先建立SAM,和上一题一样按照拓扑序求出size(表示这个串出现的次数)。这道题我们需要求第 k 小,所以我们还要求出每个点下面一共有多少个串。搜第 k 小就dfs深搜就可以了。 #include <cstdio> #include <cstring> #define N 5000...原创 2018-06-15 10:01:06 · 294 阅读 · 0 评论 -
洛谷P3804【模板】后缀自动机
4. 洛谷P3804【模板】后缀自动机 题意:求字符串 S 中所有出现次数不为 1 的子串的出现次数乘上该子串长度的最大值。 方法:建立SAM,令叶子节点 size 等于 1。按照拓扑序从下往上计数。个数大于1的就累计结果。 #include <cstdio> #include <cstring> #include <algorithm> using na...原创 2018-06-15 09:59:59 · 343 阅读 · 0 评论 -
spoj8222 Substrings (后缀自动机)
spoj8222 Substrings 题意:f[x]表示所有长度为 x 的子串中,出现次数的最大值。求所有f[x] 方法:建立SAM,根据拓扑序找到长度为 x 的子串个数,更新一下就行了 #include <stdio.h> #include <string.h> #define N 250010 char str[N]; int root,cnt=0,n,last...原创 2018-06-15 09:51:12 · 395 阅读 · 0 评论 -
bzoj2882/洛谷1368 工艺 (后缀自动机求最小表示法)
bzoj2882/洛谷1368 工艺 题意:求n个数的最小表示法 方法:把这n个数循环两次建SAM,因为不是字母,所以要用map存…然后输出就好了 开始没写读入优化…就t了….惨啊 #include <cstdio> #include <cstring> #include <map> #include <algorithm> using na...原创 2018-06-15 09:39:24 · 334 阅读 · 0 评论 -
最长公共子串问题
求最长公共子串,基本就是求两个串或多个串~ 方法也就是把一个串建SAM,剩下的进行匹配就好啦 1.spoj1811 LCS 题意:求两个串的最长公共子串 方法:用第一个串建立SAM,第二个串在第一个串上找就可以。有点类似ac自动机跑fail指针吧,匹配失败了就往前跳 不过好像不能用c++交诶..就很气 #include <stdio.h> #include <st...原创 2018-06-15 09:37:36 · 441 阅读 · 0 评论 -
bzoj3676/洛谷3649 [Apio2014]回文串
bzoj3676/洛谷3649 [Apio2014]回文串 题意:找到出现次数∗∗*长度最大的回文子串 方法一:通过manacher找到回文串,然后到SAM中搜有多少个….. 然而…会t…. 而我们会发现在SAM中搜有多少个,也就是找到这个回文串的最后一个字符,它的size 所以倍增直接找到最后一个点就可以了 #include &amp;lt;cstdio&amp;gt; #include &amp;lt;...原创 2018-06-14 16:57:47 · 250 阅读 · 0 评论 -
bzoj3238/洛谷4284 [Ahoi2013]差异 (后缀数组/后缀自动机)
bzoj3238/洛谷4284 [Ahoi2013]差异 题意:设 TiTiT_i 表示从i开始的后缀。求∑1≤i≤j≤nlen(Ti)+len(Tj)−lcp(Ti,Tj)∑1≤i≤j≤nlen(Ti)+len(Tj)−lcp(Ti,Tj)\sum\limits_{1\leq i\leq j\leq n}len(T_i)+len(T_j)-lcp(T_i,T_j) 方法:显然∑1≤i≤j≤...原创 2018-06-14 11:57:57 · 225 阅读 · 0 评论