
后缀自动机Sam
stargazer.
夜を穿つの
展开
-
【LOJ #6071】「2017 山东一轮集训 Day5」字符串(Sam)
传送门总感觉好像之前考试做过??反正考虑从后往前填如果每个点某个值没有出边往后面第一个根出去存在这个值的连向的那个点连边跑拓扑排序即可不用实在连,记一下即可#include<bits/stdc++.h>using namespace std;#define cs const#define re register#define pb push_back#define...原创 2020-02-17 14:58:23 · 295 阅读 · 0 评论 -
【洛谷 P4384】 [八省联考2018]制胡窜(SAM / 线段树合并)
传送门首先建出SamSamSam,线段树合并维护endposendposendpos显然考虑endposendposendpos问题可以变成给定xxx条线段[li,ri][l_i,r_i][li,ri]选择两个点切下去,存在某条线段未被切开的方案首先转化成求所有线段都被切开的方案用C(n−1)2C^2_{(n-1)}C(n−1)2减去即可设L=r1,R=lxL=r_1,R=l_...原创 2020-02-13 22:52:41 · 222 阅读 · 0 评论 -
【Codeforces 700E】Cool Slogans(后缀自动机+线段树合并)
传送门首先满足条件的一定是failfailfail树上的一条链然后就是要求一个在另一个里出现了两次这个维护一下endposendposendpos集合就可以判断了从上往下递推找到最长的即可有些细节可以见代码对克隆节点的处理#include<bits/stdc++.h>using namespace std;#define cs const#define re regi...原创 2020-01-17 08:43:09 · 256 阅读 · 0 评论 -
【BZOJ2806】【CTSC2012】—熟悉的文章(二分答案+广义后缀自动机+单调队列优化dp)
传送门考虑二分这样一个LLL现在问题变成是否存在一种切分使得满足熟悉的占909090以上可以考虑dpdpdp设f[i]f[i]f[i]表示前iii位最长的则f[i]=maxj∈[i−match,i−l]f[j]+i−jf[i]=\max_{j\in[i-match,i-l]}{f[j]+i-j}f[i]=j∈[i−match,i−l]maxf[j]+i−jmatchmatchmat...原创 2019-09-27 08:00:14 · 120 阅读 · 0 评论 -
【BZOJ2780】【SPOJ8093】—Sevenk Love Oimaster(广义后缀自动机)
传送门广义后缀自动机模板题注意是求在多少个串出现于是要记一个visvisvis表示是否被当前串更新过可以每加入一个字符就暴力跳failfailfail更新sizsizsiz但这样在新建clonecloneclone节点的时候sizsizsiz和visvisvis也要传递也可以所有串加完之后再遍历自动机更新#include<bits/stdc++.h>using name...原创 2019-09-27 08:03:54 · 160 阅读 · 0 评论 -
【BZOJ2882】—工艺(后缀自动机)
传送门把串倍长建SamSamSam即可#include<bits/stdc++.h>using namespace std;const int RLEN=1<<20|1;inline char gc(){ static char ibuf[RLEN],*ib,*ob; (ob==ib)&&(ob=(ib=ibuf)+fread(ib...原创 2019-09-27 08:04:47 · 105 阅读 · 0 评论 -
【BZOJ4180】—字符串计数(二分答案+后缀自动机+矩阵快速幂)
传送门定义f[i][j]f[i][j]f[i][j]为以iii开头jjj结尾的最短的不会被别的串表示出来的串这个可以在SamSamSam上dpdpdp得到考虑二分答案于是只需要看midmidmid次拼出的串是否比nnn大即可#include<bits/stdc++.h>using namespace std;const int RLEN=1<<20|1;in...原创 2019-09-27 17:59:56 · 174 阅读 · 0 评论 -
【洛谷P4112】【HEOI2015】—最短不公共子串(序列自动机+后缀自动机+DP)
传送门对2个串分别建出SamSamSam和序列自动机对四种情况分别跑一次n2dpn^2dpn2dp即可#include<bits/stdc++.h>using namespace std;const int RLEN=1<<20|1;inline char gc(){ static char ibuf[RLEN],*ib,*ob; (ob==ib...原创 2019-09-27 18:02:37 · 151 阅读 · 0 评论 -
【LOJ #6041】【雅礼集训 2017 Day7】—事情的相似度(后缀自动机+LCT+树状数组)
传送门暴力膜小明玩着自己的iphone 6siphone\ 6siphone 6s过河,不小心手机掉水里了。这时河神出来了,问小明:“你掉的是金iphoneiphoneiphone啊,还是银iphoneiphoneiphone啊”。小明很诚实的说自己的是普通的iphone 6siphone\ 6siphone 6s,于是河神拿了一个iphone&n...原创 2019-09-27 18:22:48 · 283 阅读 · 0 评论 -
【洛谷P4081】【USACO17DEC】—Standing Out from the Herd(广义Sam)
传送门建出广义SamSamSam后暴力更新即可#include<bits/stdc++.h>using namespace std;const int RLEN=1<<20|1;inline char gc(){ static char ibuf[RLEN],*ib,*ob; (ob==ib)&&(ob=(ib=ibuf)+frea...原创 2019-10-08 13:48:20 · 133 阅读 · 0 评论 -
【Codeforces 666 E】—Forensic Examination(广义Sam+线段树合并)
传送门考虑对所有串建出广义SamSamSam用线段树合并维护每个节点在哪些串中出现以及最大出现次数对于每个询问,先找到rrr匹配到的节点然后树上倍增找到s[l,r]s[l,r]s[l,r]对应的节点在线段树上查询即可要特判这个串没有匹配的情况#include<bits/stdc++.h>using namespace std;const int RLEN=1<&...原创 2019-10-08 14:01:18 · 195 阅读 · 0 评论 -
【BZOJ3413】—匹配(后缀自动机+线段树合并)
传送门相当于对每个询问串询问和一堆串的lcplcplcp考虑对询问串的每一位iii分别考虑会和多少个串匹配到这一位假设最后末尾在ppp匹配上那显然就是当前这一位对应的节点的endposendposendpos在[i,p+i−len][i,p+i-len][i,p+i−len]范围内如果一直没匹配上就是[i,n][i,n][i,n]内然后线段树合并维护endposendposendpos...原创 2019-09-26 22:08:38 · 291 阅读 · 0 评论 -
【BZOJ #4556】【Tjoi2016&Heoi2016】—字符串(后缀自动机+线段树合并)
传送门仍然和后缀数组做法一样考虑二分由于是公共前缀对反串建SamSamSam然后倍增找到C,C+midC,C+midC,C+mid对应的那个节点就相当于看endposendposendpos是否有在a,b−mid+1a,b-mid+1a,b−mid+1里线段树合并维护$endpos即可#include<bits/stdc++.h>using namespace std;...原创 2019-09-26 22:00:15 · 146 阅读 · 0 评论 -
【BZOJ 3756】—Pty的字符串(广义后缀自动机)
传送门由于给出TrieTrieTrie了直接跑广义SamSamSam即可相当于模板了注意广义SamSamSam模板的几处特判 (虽然并不知道是否真的有用)#include<bits/stdc++.h>using namespace std;const int RLEN=1<<20|1;inline char gc(){ static char ibu...原创 2019-09-25 22:07:06 · 177 阅读 · 0 评论 -
【SDOI2016】—生成魔咒(后缀自动机)
传送门比较好的SamSamSam简单题了主要看你对后缀自动机的理解其实就是让你统计每加入一个字符会生成多少个新的子串其实就是每次把修改或者新建了的节点u的len[u]−len[link[u]]len[u]-len[link[u]]len[u]−len[link[u]],加起来就是了#include<bits/stdc++.h>using namespace std;#de...原创 2018-12-22 08:52:23 · 177 阅读 · 0 评论 -
【TJOI2015】—弦论(后缀自动机)
传送门第一次看见这样强行套两道题的首先字典序最小的子串肯定是在自动机上贪心而如果我们第一步走最小的转移那么第一个字符确定后无论剩下字符是什么,这些子串都绝对是最小的那些第二小的转移类似所以我们只需要在SamSamSam上统计每个点能dfsdfsdfs到的子树大小(虽然这不是一棵树,但其实意思是一样的,毕竟这是一个DAGDAGDAG)其实可以按照lenlenlen排序后从小往大枚举Sa...原创 2018-12-22 09:49:30 · 289 阅读 · 0 评论 -
【AHOI2013】—差异(后缀自动机)
传送门大意:给你一个字符串,求所有子串两两的最长公共前缀之和考虑我们可以把串倒过来建SamSamSam,就变成了求所有子串的最长公共后缀之和就是Parent−TreeParent-TreeParent−Tree上两个endposendposendpos集合的距离看到一种妙♂妙的方法直接考虑每条边eee对答案的贡献就是其siz[e]∗(n−siz[e])∗(endpos集合大小)(siz...原创 2018-12-29 21:41:09 · 214 阅读 · 0 评论 -
【HNOI2016】—找相同字符(后缀自动机)
传送门一道不错的题虽然不知道为什么一群DalaoDalaoDalao要用广义SamSamSamSamSamSam随便搞啊首先我们可以先对一个串建SamSamSam用另一个串在上面跑我们考虑对于第二个串的每一个结尾对答案的贡献数显然是Parent−TreeParent-TreeParent−Tree上当前SamSamSam所在的点到的根的所有子串的大小当然这只是大概的一个说法,实际上...原创 2018-12-29 21:57:13 · 144 阅读 · 0 评论 -
【BZOJ3926】【ZJOI2015】—诸神眷顾的幻想乡(广义后缀自动机)
传送门考虑怎么样才能构造出匹配所有字符的后缀自动机发现显然问题出在树上分叉处,需要分别对几个儿子构造而方向不同会导致问题但是这道题保证叶子结点不到202020个从每个叶子节点开始dfsdfsdfs一次,对所有串建一个广义SamSamSam即可注意构建方式,每个儿子继承父亲的lastlastlast而SamSamSam上一个点对应子串个数就是len[i]−len[fa[i]]len[...原创 2019-07-02 20:01:50 · 119 阅读 · 0 评论 -
Codeforces #235 C.Cyclical Quest(后缀自动机)
传送门题意:给定一个模式串和nnn个匹配串,询问原串有多少个子串和匹配串循环同构考虑要求循环同构,于是先对SSS建出后缀自动机把每次询问的XXX倍长在自动机上跑如果当前匹配的长度已经超过原串长时跳failfailfail到原串应该的位置上注意自动机上每个点的贡献只记一次#include<bits/stdc++.h>using namespace std;const i...原创 2019-07-05 16:47:39 · 192 阅读 · 0 评论 -
【BZOJ1396】—识别子串(后缀自动机+线段树)
传送门显然只出现一次的节点就是SamSamSam的failfailfail树的叶子节点考虑对于一个叶子节点uuu和父亲vvv对于i∈[len[u]−len[v]]i\in[len[u]-len[v]]i∈[len[u]−len[v]],答案可能是len[v]+1len[v]+1len[v]+1对于i∈[1,len[u]−len[v]−1],答案可能是len[u]−i+1i\in[1,le...原创 2019-07-15 18:01:04 · 173 阅读 · 0 评论 -
【LOJ#2720】【NOI2018】—你的名字(后缀自动机+线段树合并)
传送门人菜常数大系列先考虑686868分的做法答案就是TTT的本质不同子串个数−-−TTT和SSS的公共子串对TTT建一个SamSamSam统计第一部分第二部分就只需要TTT在SSS上跑,维护一下当前最长匹配长度和判重就可以了考虑当l̸=rl\not= rl̸=r的时候我们就需要知道在某一个区间有没有出现当前匹配的串假设当前匹配长度为xxx,我们当前在SamSamSam匹配到p...原创 2019-07-18 15:36:22 · 200 阅读 · 0 评论 -
【BZOJ3879】—SvT(后缀自动机+虚树/后缀自动机+单调栈)
传送门后缀数组终于跑过了SamSamSam了后缀自动机上虚树是显然的后缀数组就按rkrkrk排序后考虑每个位置的贡献,显然就是左右都比他大的时候单调栈维护一下就是了后缀数组+单调栈#include<bits/stdc++.h>using namespace std;const int RLEN=1<<20|1;inline char gc(){ ...原创 2019-07-18 15:44:15 · 216 阅读 · 0 评论 -
【TJOI2019 Day2】简要题解
T1:传送门傻逼题考虑到kkk很小,把2k+12k+12k+1种暴力建出来跑dijdijdij就可以了结果出题人竟然不卡优先队列的O(n+mklog)O(n+mklog)O(n+mklog)写法跑的还比set的O(m+nklog)set的O(m+nklog)set的O(m+nklog)快……#include<bits/stdc++.h>using namespace st...原创 2019-09-03 18:32:44 · 155 阅读 · 0 评论 -
【BZOJ5337】【TJOI2018】—STR(后缀自动机+dp)
传送门既然是问一堆串拼出一个串的子串的方案数,那显然是要在这个串的SamSamSam上dpdpdp了考虑f[i][j]f[i][j]f[i][j]表示前iii个匹配串,匹配到jjj的方案数则可以暴力枚举自动机上的点看能不能从这个点开始匹配完一个串可以的话就转移复杂度O(S∗∑∣lenai∣)O(S*\sum |len_{a_i}|)O(S∗∑∣lenai∣)#include<...原创 2019-02-24 20:12:10 · 187 阅读 · 0 评论