
【数据结构】后缀自动机与后缀树
文章平均质量分 87
cz_xuyixuan
这个作者很懒,什么都没留下…
展开
-
【BZOJ4327】【JSOI2012】玄武密码
【题目链接】点击打开链接【思路要点】后缀自动机模板题。时间复杂度\(O(字符串长度)\)。【代码】#includeusing namespace std;const int MAXN = 20000005;const int MAXC = 4;template void read(T &x) { x = 0; int f原创 2018-02-07 10:40:18 · 519 阅读 · 0 评论 -
【BZOJ2946】【POI2000】公共串
【题目链接】点击打开链接【思路要点】补档博客,无题解。【代码】#include<bits/stdc++.h>using namespace std;#define MAXN 20005#define MAXM 10#define CSIZE 26template <typename T> void read(T &x) { x = 0; int f = ...原创 2018-05-20 11:21:11 · 236 阅读 · 0 评论 -
【BZOJ4180】字符串计数
【题目链接】点击打开链接【思路要点】补档博客,无题解。【代码】#include<bits/stdc++.h>using namespace std;#define MAXN 200005#define MAXC 4#define MAXLOG 63const long long INF = 1.5e18;template <typename T> void re...原创 2018-05-20 13:43:10 · 390 阅读 · 0 评论 -
【CodeForces452E】Three strings
【题目链接】点击打开链接【思路要点】建立多串后缀树,每个节点对答案数组的贡献可以描述为一次区间加操作,差分+前缀和即可。时间复杂度\(O(\sum|S|)\)。【代码】#include<bits/stdc++.h>using namespace std;const int MAXN = 300005;const int P = 1e9 + 7;template <type...原创 2018-04-29 13:49:50 · 407 阅读 · 0 评论 -
【BZOJ2555】SubString
【题目链接】点击打开链接【思路要点】补档博客,无题解。【代码】#include<bits/stdc++.h>using namespace std;#define MAXN 1200005#define MAXM 3000005template <typename T> void read(T &x) { x = 0; int f = 1; char c...原创 2018-05-21 11:24:48 · 224 阅读 · 0 评论 -
【BZOJ3879】SvT
【题目链接】点击打开链接【思路要点】补档博客,无题解。【代码】#include<bits/stdc++.h>using namespace std;#define MAXN 1000005#define MAXM 3000005#define MAXLOG 22template <typename T> void read(T &x) { x = 0; ...原创 2018-05-21 16:54:56 · 367 阅读 · 0 评论 -
【BZOJ4199】【UOJ131】【NOI2015】品酒大会
【题目链接】BZOJUOJ【思路要点】建立母串的后缀树,分别考虑每一条树边上所有的字符串。假设该树边指向节点\(x\),其子树内后缀结尾数为\(Size_x\),表示的字符串长度为\(Depth_i\)。那么这条边上的字符串会对满足\(r\in(Depth_{father},Depth_x]\)的\(r\)的答案产生\(\binom{Size_x}{2}\)的贡献。DFS一遍,然后差分+前缀和即可...原创 2018-05-27 16:01:29 · 226 阅读 · 0 评论 -
【BZOJ5337】【TJOI2018】str
【题目链接】点击打开链接【思路要点】在SAM上DP,转移较为显然。时间复杂度\(O(|S|*\sum|T|)\),其中\(\sum|T|\)为模式串长度总和。【代码】#include<bits/stdc++.h>using namespace std;const int MAXN = 20005;const int MAXK = 105;const int P = 1e9 + ...原创 2018-06-13 10:28:14 · 328 阅读 · 0 评论 -
【CodeForces316G】Good Substrings
【题目链接】 点击打开链接 【思路要点】 建立多串后缀树,依次考虑树上每一条边上代表的字符串是否应该被统计。 不妨设当前考虑的是节点xxx与其父亲fatherfatherfather的连边。 若节点xxx满足子树内存在SSS的结尾,并且子树内pipip_i的结尾个数cnticnticnt_i满足li≤cntx≤rili≤cntx≤ril_i≤cnt_x...原创 2018-06-29 20:44:42 · 429 阅读 · 0 评论 -
【BZOJ5417】【UOJ395】【NOI2018】你的名字
【题目链接】 BZOJ UOJ 【思路要点】 对 SSS 用后缀自动机建后缀树,并在其 DFSDFSDFS 序上建立主席树。 考虑一个询问 (T,ql,qr)(T,ql,qr)(T,ql,qr) ,从后到前依次考虑其每一个后缀对答案的贡献,显然对于每一个后缀 iii ,存在一个长度 lenlenlen ,当且仅当 j>i+lenj>i+le...原创 2018-09-11 14:04:31 · 669 阅读 · 0 评论 -
【省内训练2018-09-13】Border
【思路要点】 注意到字符串的生成方式近乎随机,不妨认为对于一个后缀 S[i...N]S[i...N]S[i...N] 与其余后缀的 LCPLCPLCP 的最大值 kikik_i 不会很大,事实上,当字符串随机时, kikik_i 期望为 O(LogN)O(LogN)O(LogN) 级别。 用后缀树求出 kikik_i ,那么 S[i...i],S[i...i+1],...,S[...原创 2018-09-13 16:08:39 · 375 阅读 · 0 评论 -
【CodeForces】CodeForces Round #530 (Div. 1) 题解
【比赛链接】点击打开连接【题解链接】点击打开链接**【A】**Sum in the tree【思路要点】题目中给出的限制条件相当于限定了所有深度为奇数的点及其父亲的权值和,显然,将深度为偶数的非叶节点的权值设置得尽可能大有利于减少全局权值和。时间复杂度 O(N)O(N)O(N) 。【代码】#include&lt;bits/stdc++.h&gt;usi...原创 2019-01-20 11:30:34 · 651 阅读 · 0 评论 -
【省内训练2019-06-03】String
【思路要点】不难发现对于已知的字符串 SSS ,计算编辑距离可以直接贪心。因此,计算出矩阵 matmatmat ,其中 mati,jmat_{i,j}mati,j 表示 TTT 中未出现的最短的以 iii 开头, jjj 结尾的字符串的长度,用矩阵乘法即可计算编辑距离为 xxx 的最短串的长度。二分答案即可。关于矩阵 matmatmat 的计算可以采用在后缀自动机上 dpdpdp 的...原创 2019-06-06 15:30:33 · 215 阅读 · 0 评论 -
【省内训练2019-06-04】字符串
【思路要点】枚举 i−ji-ji−j ,计算最大的 kkk 使得 S[i−j+1…i−j+k]S[i-j+1\dots i-j+k]S[i−j+1…i−j+k] 为 S[1…i−j]S[1\dots i-j]S[1…i−j] 的子串,则由该问题的答案显然可以解决原问题。需要维护字符串 S,TS,TS,T ,支持在 SSS 后加入字符,保证 TTT 是 SSS 的子串的情况下在 TTT 后加...原创 2019-06-07 11:57:36 · 182 阅读 · 0 评论 -
【省内训练2019-06-02】可爱
【思路要点】首先在后缀 TrieTrieTrie 上考虑本题,考虑枚举不同的位置在后缀 TrieTrieTrie 上对应的节点,则后接的字符串应当对应相同。那么,维护各节点 iii 子树中长度为 MMM 的字符串的后 M−depthiM-depth_iM−depthi 位的哈希值,则后接字符串对应相同即为哈希值对应相同,启发式合并即可更新答案。需要对哈希表进行整体加的操作,因此需要为每...原创 2019-06-04 16:40:55 · 342 阅读 · 0 评论 -
【LOJ3049】「十二省联考 2019」字符串问题
【题目链接】点击打开链接【思路要点】直接在后缀树上建边跑最长路就行了。时间复杂度 O(NaLog∣S∣+NbLog∣S∣+∣S∣Log∣S∣+M)O(N_aLog|S|+N_bLog|S|+|S|Log|S|+M)O(NaLog∣S∣+NbLog∣S∣+∣S∣Log∣S∣+M) 。【代码】#include<bits/stdc++.h>const in...原创 2019-06-17 20:44:42 · 333 阅读 · 0 评论 -
【CodeForces】CodeForces Round #475 (Div. 1 + Div. 2) 题解
【比赛链接】Div. 1Div. 2【题解链接】点击打开链接【Div.2 A】Splits【思路要点】由于我们希望得到尽可能不同的权值,我们可以考虑在拆分的开头放置若干个2,然后放1填补剩余的数字。不难发现答案等于\(\lfloor\frac{N}{2}\rfloor+1\)。时间复杂度\(O(1)\)。【代码】#include<bits/stdc++.h>using namespa...原创 2018-04-28 20:39:40 · 497 阅读 · 0 评论 -
【BZOJ4516】【SDOI2016】生成魔咒
【题目链接】点击打开链接【思路要点】补档博客,无题解。【代码】#include<bits/stdc++.h>using namespace std;#define MAXN 200005template <typename T> void read(T &x) { x = 0; int f = 1; char c = getchar(); for (; ...原创 2018-05-18 14:57:24 · 138 阅读 · 0 评论 -
【USACO】2017 December Contest, Platinum题解
【比赛经历】大概顺利满分了,就是T2的代码比较难调。T2能够直观地反映出GDB和输出调试结合的优越性。【T1】Standing Out from the Herd【题目链接】点击打开链接【题解链接】点击打开链接【思路要点】后缀的前缀是子串,考虑使用后缀结构来解题。笔者选用的是后缀树。对所原创 2018-02-07 12:54:53 · 1031 阅读 · 0 评论 -
【CodeForces149E】Martian Strings
【题目链接】点击打开链接【思路要点】正反建立两个后缀自动机,并正反匹配每个模式串,记录每一个模式串的前缀至少是多长的母串前缀的后缀,以及每一个模式串的后缀至少是多长的母串的后缀的前缀,然后枚举左右两段的长度判断即可。注意特判模式串长度为1的情况。时间复杂度\(O(N+\sum|S|)\)。【代码】#include<bits/stdc++.h>using namespace std;...原创 2018-03-15 10:34:50 · 522 阅读 · 0 评论 -
【CodeForces204E】Little Elephant and Strings
【题目链接】点击打开链接【思路要点】建立多串的后缀树,如果一个节点的子树内出现超过K种字符串的结尾,那么这个节点的父边上所有的字符串是合法的,这个节点的父边上字符串的个数就是这个节点的深度减去其父亲的深度,否则记为0。判断一个节点的子树内是否出现超过K种字符串的结尾可以将后缀树进行DFS序重标号,问题就转化为了求一些区间内颜色的种类数。将询问按左端点排序,用离线询问+树状数组解决即可。完成判断后进...原创 2018-03-15 13:24:09 · 488 阅读 · 0 评论 -
【BZOJ3473】字符串
【题目链接】点击打开链接【双倍经验链接】【BZOJ3277】串【思路要点】补档博客,无题解。【代码】#include<bits/stdc++.h>using namespace std;#define MAXN 200005#define MAXL 100005struct Suffix_Automaton { map <char, int> child[MAXN...原创 2018-03-29 20:36:59 · 380 阅读 · 0 评论 -
【CodeForces123D】String
【题目链接】点击打开链接【思路要点】用后缀树做就是一道模板题了,官方题解给的做法应该是后缀数组的。时间复杂度\(O(|S|)\)。【代码】#include<bits/stdc++.h>using namespace std;const int MAXN = 100005;template <typename T> void chkmax(T &x, T y) ...原创 2018-03-14 15:53:23 · 371 阅读 · 0 评论 -
【CodeForces666E】Forensic Examination
【题目链接】点击打开链接【思路要点】这个题写得我很爽啊。想法其实不难,建立多串后缀树,然后将询问离线,用线段树合并来回答询问。后缀的前缀是子串,母串的一个子串可以通过从后缀树上某个表示母串对应后缀的节点向上倍增得到。时间复杂度\(O(|S|Log|S|)\)(\(|S|\),\(Q\),\(M\),\(\sum|T|\)同阶)。【代码】#include<bits/stdc++.h>u...原创 2018-03-31 11:15:35 · 396 阅读 · 0 评论 -
【BZOJ3277】串
【题目链接】点击打开链接【双倍经验链接】【BZOJ3473】字符串【思路要点】补档博客,无题解。【代码】#include<bits/stdc++.h>using namespace std;#define MAXN 200005#define MAXL 100005struct Suffix_Automaton { map <char, int> child[MA...原创 2018-03-31 11:20:25 · 216 阅读 · 0 评论 -
【BZOJ1396】识别子串
【题目链接】点击打开链接【双倍经验链接】【BZOJ2865】字符串识别【思路要点】补档博客,无题解。【代码】#include<bits/stdc++.h>using namespace std;#define MAXN 200005struct Segment_Tree { int lc[MAXN], rc[MAXN], ans[MAXN]; int root, size, ...原创 2018-03-31 16:47:12 · 533 阅读 · 0 评论 -
【BZOJ2865】字符串识别
【题目链接】点击打开链接【双倍经验链接】【BZOJ1396】识别子串【思路要点】补档博客,无题解。【代码】#include<bits/stdc++.h>using namespace std;#define MAXN 200005struct Segment_Tree { int lc[MAXN], rc[MAXN], ans[MAXN]; int root, size, n...原创 2018-03-31 16:47:58 · 576 阅读 · 0 评论 -
【BZOJ3926】【ZJOI2015】诸神眷顾的幻想乡
【题目链接】点击打开链接【思路要点】补档博客,无题解。【代码】#include<bits/stdc++.h>using namespace std;#define MAXN 100005#define MAXP 4000005#define MAXC 10struct Suffix_Automaton { int child[MAXP][MAXC]; int father...原创 2018-03-31 20:17:14 · 213 阅读 · 0 评论 -
【BZOJ3998】【TJOI2015】弦论
【题目链接】点击打开链接【思路要点】后缀自动机模板题。时间复杂度\(O(N)\)。【代码】#include<bits/stdc++.h>using namespace std;#define MAXN 1000005#define MAXC 26#define STARTC 'a'char alpha[MAXC];struct Suffix_Automaton { str...原创 2018-03-27 19:58:48 · 313 阅读 · 0 评论 -
【BZOJ4566】【HAOI2016】找相同字符
【题目链接】点击打开链接【思路要点】补档博客,无题解。【代码】#include<bits/stdc++.h>using namespace std;#define MAXN 800005#define MAXC 26struct Suffix_Automaton { int child[MAXN][MAXC]; int father[MAXN], depth[MAXN];...原创 2018-03-27 20:50:40 · 264 阅读 · 0 评论 -
【BZOJ5253】【2018多省省队联测】制胡窜
【题目链接】点击打开链接【思路要点】首先,一个询问的答案只和询问串的在主串中所有出现的位置有关。直接求解所有出现位置显然会超时,一种可行的方法是用离线询问+后缀自动机(树)+线段树合并来维护出现位置的右端点集合。先解决一个小问题:定位一个询问可以在后缀树上倍增在\(O(LogN)\)的时间内完成。现在我们有了一棵维护着所有询问串出现位置的右端点的线段树,考虑如何得到答案。考虑计算出所有的两个断点把...原创 2018-04-10 17:32:40 · 968 阅读 · 2 评论 -
【BZOJ4755】【JSOI2016】扭动的回文串
【题目链接】点击打开链接【思路要点】一定存在一个最长的扭动回文串是从回文中心所在串的某一个极长回文子串开始,一侧向回文中心所在串匹配,另一侧扭向另一个串匹配。因为任意一个扭动的回文串都对应了一个同样长的满足上述要求的扭动的回文串。枚举回文中心,问题转化为了两个字符串的LCP,字符串哈希和后缀结构均可解决。时间复杂度\(O(NLogN)\)。【代码】#include<bits/stdc++.h...原创 2018-04-10 21:02:55 · 322 阅读 · 0 评论 -
【BZOJ2780】【SPOJ8093】Sevenk Love Oimaster
【题目链接】点击打开链接【思路要点】补档博客,无题解。【代码】#include<bits/stdc++.h>using namespace std;#define MAXN 200005#define MAXL 360005struct Suffix_Automaton { map <char, int> child[MAXN]; int father[MAXN...原创 2018-03-28 14:10:21 · 289 阅读 · 0 评论 -
【省内训练2019-06-29】Words
【思路要点】我们本质上需要对每一对字符串 Si,SjS_i,S_jSi,Sj ,计算 F(Si,Sj)F(S_i,S_j)F(Si,Sj) 表示最大的 LLL 使得 SiS_iSi 的长度为 LLL 的后缀等于 SjS_jSj 长度为 LLL 的前缀。建立多串后缀树,对于每一个代表完整的串 SjS_jSj 的节点 xxx, F(Si,Sj)F(S_i,S_j)F(Si,Sj...原创 2019-06-29 14:55:57 · 436 阅读 · 0 评论