![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
后缀自动机
make_it_for_good
这个作者很懒,什么都没留下…
展开
-
bzoj 2806 [Ctsc2012]Cheat 后缀自动机 单调队列优化dp
首先把字典中所有的串接在一起,两两间用非法字符隔开,跑一个后缀自动机(感觉这样比广义后缀自动机好写一些?) 然后对于要匹配的串在后缀自动机里跑一遍得到每个点向前能匹配的最大长度v[i]。求的东西可以二分答案。然后dp,设f[i]表示到i能匹配上的所有子串最大长度。f[i]=⎧⎩⎨max(f[i],f[j])(j∈[0,i−1])max(f[i],f[j]+v[i])(j∈[0,i−v[i]])max原创 2016-10-24 10:58:35 · 285 阅读 · 0 评论 -
bzoj 3172 [Tjoi2013]单词 后缀自动机
把所有串放在一起,两个串中间加非法字符,建一个后缀自动机。 然后按拓扑序遍历自动机,求一个点子树中的结尾数量。 然后对于每个串,在后缀自动机中跑trs指针找到对应终点。 那么这个串的答案就是终点子树中的结尾数量。#include <bits/stdc++.h>using namespace std;#define N 1100000int n,len,l[210],beg[210];c原创 2016-10-25 10:27:51 · 360 阅读 · 0 评论 -
bzoj 3926 [Zjoi2015]诸神眷顾的幻想乡 后缀自动机
第一眼:树上路径,每个点的度数<=20 ? 树分治! 然而并搞不出来。发现题意是叶子数不超过20。。。如果以每个叶节点为根建trie树,那么每个串都在这些trie的子串中出现过。深搜每个trie,每个点以父亲为last建后缀自动机。#include <bits/stdc++.h>using namespace std;#define N 4100000#define ll long long原创 2016-10-28 19:33:43 · 261 阅读 · 0 评论 -
bzoj 2555 SubString 后缀自动机 LCT
如果只有查询,那么建一个后缀自动机,建完后扫一遍求每个点子树里的叶节点个数(right集合大小)。 然后查询就从根开始走trs指针。不过这题还有在串后补字符的操作,加字符时维护子树叶节点个数如果直接往上修改就变成O(n2)O(n^2) 的了。(听说加了一组数据。。。) 由于每次修改都是单点或是一条链,因此可以用LCT维护父亲的关系和一个点子树中叶子个数。#include <bits/stdc++原创 2016-10-20 17:58:49 · 259 阅读 · 0 评论 -
bzoj 3998 [TJOI2015]弦论 后缀数组||后缀自动机
一开始写了一发后缀数组。 T=0的时候直接把所有的n-sa[i]+1-h[i]加到一起一直到K就行了。 T=1时枚举每一位是什么,二分求一下范围,处理一个n-sa[i]+1的前缀和。 本来以为会T,结果并没有。。。#include <bits/stdc++.h>using namespace std;#define N 510000#define ll long longchar s[原创 2016-10-31 10:33:13 · 594 阅读 · 0 评论 -
bzoj 4516 [Sdoi2016]生成魔咒 后缀自动机
字符集太大,用map记录trs指针维护后缀自动机。#include <bits/stdc++.h>using namespace std;#define ll long long#define N 210000int n;ll ans;struct SAM{ map<int,int>trs[N]; int cnt,len[N],fa[N],last; void原创 2016-11-02 15:49:22 · 303 阅读 · 0 评论