
SAM
文章平均质量分 67
Deep_Kevin
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Check,Check,Check one two!,洛谷P5115,SAM fail树上合并答案
首先我们考虑对于一个点对(i,j)(i,j)(i,j)来说,要找到前面极长的匹配aaa,后面极长的匹配bbb,贡献是两者长度的乘积(a+1)∗(b+1)(a+1)*(b+1)(a+1)∗(b+1),我们考虑在SAM上(i+p,j+p),p∈[0,b](i+p,j+p),p\in[0,b](i+p,j+p),p∈[0,b]两个endposendposendpos合并时统计(i,j)(i,j)(i,j)的贡献。由于后缀自动机上两个endposendposendpos的LCALCALCA的maxlenmaxle原创 2021-01-28 20:46:50 · 178 阅读 · 0 评论 -
SAM,ACAM,PAM 辨析
正题 SAM,Suffix AutoMaton,后缀自动机,可以识别每一个后缀,拥有多个结束点,实际上可以识别所有的子串,所以我更愿意将它理解为子串自动机 ACAM,Aho-Corasick AutoMaton,AC自动机,可以识别所有串的前缀,所以我更愿意将它理解为它前缀自动机. PAM,Palindrome AutoMaton,回文自动机,可以识别该串的所有回文子串.同类型名称辨析 点 SAM上的一个点对应着一个等价类,这个等价类...原创 2020-09-09 20:39:31 · 1012 阅读 · 0 评论 -
[JSOI2013]快乐的 JYY,洛谷P5685,广义SAM+PAM
正题 本质上与秩序魔咒毫无区别,就是换个方法来维护,原来只要看看是否都存在,现在要存 在两边出现的次数.#include<bits/stdc++.h>using namespace std;const int N=200010;char s[N],t[N];int n,m;long long ans=0;struct Suffix_AutoMaton{ int tot,las; int len[N],ch[N][26],sum[N],fa[N][20],a...原创 2020-09-09 19:45:12 · 196 阅读 · 0 评论 -
秩序魔咒,洛谷P5555,广义SAM+PAM
正题 虽然有一点难写,但是挺好想的. 大概就是用PAM求出所有本质不同的回文串,然后在SAM上看看对应点的right集合是否在两点都出现过,希望有大牛发明出广义PAM? #include<bits/stdc++.h>using namespace std;const int N=1200010;char s[N],t[N];int n,m,mmax,num;struct Suffix_AutoMaton{ int tot,las;...原创 2020-09-09 19:41:16 · 397 阅读 · 0 评论 -
专题总结:后缀数据结构
正题 简单来说就是SA和SAM. 大多数简单题都可以在这里看到,当然这里也包含了许多套路. 正确理解后缀自动机是一个DAG,每条转移边的意义,每个点rig集合的意义,管理子串连续等,fail的意义 用SAM反串建后缀树我觉得是没有什么用的,本质上可以先从SA来推导,然后再用反串建SAM. 一个串在另一个串上跑最大匹配可以知道前缀的最大匹配,两个点的LCA的len实际上是两个前缀的lcs等 理解清楚并且做了很多题之后就可以去挑...原创 2020-09-07 21:17:38 · 226 阅读 · 0 评论 -
[BJWC2018]Border 的四种求法,洛谷P4482,fail树上树链剖分
正题 首先很容易可以想到一个在fail树上跳的方法,先找到r的结束节点,向上跳,对于每一个祖先x,找最大的i,满足i<l+len[x]且i<r,所有这样的i取最大值,就可以知道border的最大右端点. 但是这样每次操作是nlogn的,(也许可以优化一个根号),但时间复杂度依然很大. 我们考虑令每次这样的询问与len[x]无关,也就是变成i-len[x]<l且i<r,一眼就可以知道这个东西也可以主席树维护,维护一个以i为下标,i-len[x]...原创 2020-09-07 21:01:10 · 322 阅读 · 0 评论 -
Cool Slogans,CF700E,SAM推结论题
正题 Portal 引理1:当k最大时,存在一组解满足s[i+1]是s[i]的后缀 如果存在最大的k为答案,若有s[i+1]不是s[i]的后缀,那么将s[i]的一部分后缀去掉,使得s[i+1]是s[i]的后缀,显然对k值没有影响. 有了这个引理,我们就可以在fail树上暴力往下跳了,只要对与父亲的每一个len,看看在子节点的right集合中[l+len-1,r-1]中是否有点即可. 引理2:父亲节点所管理的每一个串,在子节点所管理串中的出...原创 2020-09-07 20:44:25 · 163 阅读 · 0 评论 -
[NOI2018]你的名字,洛谷P4770,SAM
正题 建议先阅读且会做这些题再来做这道题 如果不用去重,不用考虑区间[l,r]? 我们让T在S所建成的SAM上跑,失配直接跳fail,那么我们可以获得一个T的前缀[1,i]的最大匹配长度,设为p[i],那么我们将i-p[i]加起来即可. 如果不用去重,考虑区间[l,r]? 我们对于SAM上的每个节点,用线段树合并来维护出这个点的right集合.一个点可以走到它的后继,若当前匹配长度为len,那么我们看看它的后继的right集合中[l+le...原创 2020-09-07 20:25:55 · 201 阅读 · 0 评论 -
习题归纳:后缀数据结构的也许不是一句话题解
正题 不同子串个数 直接输出 LCS - Longest Common Substring 对第一个串建SAM,让第二个串在上面跑,跑不动就跳fail,记录下最长的匹配长度,就是答案 [SDOI2016]生成魔咒 每次只要加上新点的贡献,也就是加上,因为新拆的点没有影响 [TJOI2019]甲苯先生和大中锋的字符串 检查每个点的right集合大小是不是k,如果是的话就给这个节点管理的长度区间加...原创 2020-09-04 22:17:04 · 275 阅读 · 0 评论