后缀自动机
吴俊达9812
这个作者很懒,什么都没留下…
展开
-
P3804 【模板】后缀自动机
思路:right 集合出现的次数的求法是将所有节点的按照len进行排序,并且将所有包含前缀的节点的 sz 置为1.最后按照len从大到小的顺序 执行 sz[ fa[x] ] += sz[x] 的操作。#include <bits/stdc++.h>using namespace std;const int maxn = 1000005;const int maxm = 2...原创 2019-08-07 11:28:49 · 128 阅读 · 0 评论 -
bzoj 4516(离线 + 在线查询每个前缀本质不同的子串个数,字符集无限)
离线版本#include <cstdio>#include <cstring>#include <iostream>#include <map>using namespace std;typedef long long LL;const int maxn = 100005;struct SAM{ int fa[maxn&l...原创 2019-09-13 14:47:29 · 200 阅读 · 0 评论 -
codeforces 235 C
题意:查询 一个串中所有不同构的循环子串在 主串中出现的次数。思路: 我们用增量的方式进行考虑,维护当前匹配到的转态,当前串的长度。当加入一个字符时,我们考虑如何维护转移就做出来了。第一次 1A 2700分的题,有点小激动。#include <bits/stdc++.h>using namespace std;const int maxn = 1000005;int...原创 2019-09-13 14:32:31 · 115 阅读 · 0 评论 -
bzoj 2780 (查询一个字符串在多少个主串中出现过)
题意:查询一个字符串在多少个主串中出现过。重点:我试过了两种在线的做法,都不可以,所以说广义后缀自动机别在线维护。#include <bits/stdc++.h>using namespace std;const int maxn =360005;const int ch_size = 26;struct SAM{ int fa[maxn<<1],...原创 2019-09-13 12:06:45 · 147 阅读 · 0 评论 -
bzoj 3926
题意:给定一个树,问任意两点间路径颜色排列构成的方案数,保证叶子节点数 <= 20。思路:任意一条路径都可表示为从叶子节点下来的一条路径上的子串。(太妙了)所以我们对20个trie树插入广义后缀自动机。#include <bits/stdc++.h>using namespace std;const int maxn =1000005;const int maxm...原创 2019-09-13 10:39:58 · 127 阅读 · 0 评论 -
bzoj 2806 后缀自动机 + 单调队列dp + 性质
题意:将 一个字符串分为几段,且其中长度 大于 L 且在文本库中出现的串的长度 大于等于90%,求满足条件的最大L思路:好题好题1.至少这种东西8成是二分(二分不要总想等于)2.考虑用dp对每一个L进行验证。这里的难点是发现dp的转移具有单调性,不太明显的单调性。主要用到 一个性质,相邻的两个前缀在另一个字符串中的最长公共后缀的 差( 后 - 前 ) <= 13.另一个...原创 2019-09-12 22:25:01 · 287 阅读 · 0 评论 -
hdu 6405 (n 个串中本质不同的子串以及他们出现在了哪些串中)
题意:给定 n 个串,询问长度为m的串在这n个串中的贡献之和的期望。贡献的求法是 出现的所有串的val的乘积。思路:首先要求输出分数,那我们分为分子和分母来考虑,分母很好求。对于分子来说,我们只需要算出长度小于等于m的所有串的贡献之和。 问题转化为 n个串中所有本质不同的子串的贡献,那么我们统计每个状态在那些串中出现过即可。疑问:这题我一开始采用在线的做法,就是每加入一个字母就更新当前串...原创 2019-09-12 13:04:20 · 430 阅读 · 0 评论 -
hdu 4641 (在线查询至少出现k次的子串)
思路:每加入一个新的字符,更新当前串所有的后缀。 1.单调性:沿着fail指针走,出现位置变多 2.不考虑cur clone 出现的位置与q一样#include <bits/stdc++.h>using namespace std;typedef long long LL;const int maxn = 300005;int righ[maxn<...原创 2019-09-11 18:48:09 · 164 阅读 · 0 评论 -
bzoj 3998: [TJOI2015]弦论
题意:字典序第k小的本质不同子串以及字典序第k小的子串。思路:dp统计#include <bits/stdc++.h>using namespace std;const int maxn = 500005;int righ[2*maxn],cnt[maxn<<1];const int ch_size = 26;struct SAM{ int fa...原创 2019-09-10 15:26:57 · 121 阅读 · 0 评论 -
spoj Lexicographical Substring Search
题意:求本质不同的子串中字典序第k小的思路:后缀自动机的每个节点向后走 能走出多少个本质不同的子串,可以通过dp求出。#include <bits/stdc++.h>using namespace std;const int maxn = 90005;int righ[2*maxn],cnt[maxn<<1];const int ch_size = 26...原创 2019-09-10 14:59:03 · 102 阅读 · 0 评论 -
bzoj 2882 工艺( SAM最小表示法字符集无限 )
题意:无限字符集的最小表示法思路:用map 来存#include <cstdio>#include <cstring>#include <iostream>#include <map>using namespace std;const int maxn = 600005;int pos[maxn<<1];struc...原创 2019-09-10 13:44:36 · 134 阅读 · 0 评论 -
spoj Substrings
题意:给一个字符串S,令F(x)表示S的所有长度为x的子串中,出现次数的最大值。求F(1)..F(Length(S)) Length(S) <= 250000思路:我们用每个状态的len来更新答案,因为所有状态即可包含所有的子串。坑点:我原来一直以为不需要进行基数排序,直到这题。。。如果不基数排序的话,clone 就是一个范例,他的儿子的标号小于他本身。#include...原创 2019-09-10 11:27:44 · 114 阅读 · 0 评论 -
SPOJ LCS2( 多个串的lcs )
题意:求多个串的LCS思路:对一个节点建立SAM,用剩下的字符串在上面跑,注意沿着 后缀链接向上走的时候,长度的变化不是-1,而是变为len[ p ],而向下走的时候一定是长度加一。#include <cstdio>#include <cstring>#include <iostream>using namespace std;const ...原创 2019-09-09 22:26:20 · 272 阅读 · 0 评论 -
spoj LCS(SAM)
题意:求两个串的LCS思路:对其中一个建SAM,另一个在上面跑。如果跑不了了就走后缀链接,注意这时候在字符串前面删除了 >= 1 个字母。串长变为 对应状态所表示的最长串。#include <cstdio>#include <cstring>#include <iostream>using namespace std;const in...原创 2019-09-09 20:51:35 · 99 阅读 · 0 评论 -
poj 1509 Glass Beads (最小表示法SAM)
题意:用sam解决最小表示法思路:用SS建立后缀自动机,从根节点向后走,每次都贪心地选择最小的字典序的走法,这样一定能保证走n步。所以我们只需要记录一下每个状态的位置就行了。记录位置的方法,我们可以注意到,每个前缀在后缀自动机中对应的状态是唯一的,而且后缀自动机中任意一个子串都可以表示为某个前缀的后缀,所以我们只需要为每一个前缀标出位置,因为fail可以理解为后缀指针,所以把沿着fail指...原创 2019-09-09 18:06:28 · 169 阅读 · 0 评论 -
luogu P2436
题意:求多个串得最长公共子序列 (字符集合无限)思路1:广义后缀自动机#include <bits/stdc++.h>using namespace std;const int maxn =1000005;int vis[maxn<<1],tim,cnt[maxn<<1];struct SAM{ int fa[maxn<<1...原创 2019-09-24 19:20:32 · 185 阅读 · 0 评论