![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
字符串---后缀数组/后缀自动机
#
夕林山寸
这个作者很懒,什么都没留下…
展开
-
2020牛客暑期多校训练营(第四场)C Count New String 巧妙的思维转化 + 广义后缀自动机板子
这一题很巧妙啊!首先题目给的式子就很吓人,但仔细分析我们就发现:其实就是求:这个只要把式子展开就能发现了。为啥能想到这?因为题目就是问本质不同的字串,我们肯定尽可能往这里构造(有后缀自动机可以解决这个问题)好了到这里我们就可n^2暴力做这题了。——把n个后缀离线插入到字典树中,然后BFS建立SAM,跑一下就行,其实就是广义后缀自动机。但显然AC不了。我们还需要优化。看题目字符集大小K=10,他这个条件肯定是有用的(除非出题人毒瘤,故意坑你,一般正常情况不会这样搞得,反正我没做原创 2020-10-01 19:26:29 · 223 阅读 · 5 评论 -
P6139 【模板】广义后缀自动机(广义 SAM) 在线加字符 建立SAM
在线做法太爽了,代码少,速度快。用法基本跟普通sam一样!!#include<bits/stdc++.h>#define ll long longusing namespace std;const int M=1e6+7;struct SAM { int maxlen[M*2], trans[M*2][26], link[M*2], tg[M*2], size, last; SAM() { size = last = 1; memset(tg,0,sizeof(tg原创 2020-09-30 20:48:06 · 132 阅读 · 0 评论 -
P6139 【模板】广义后缀自动机(广义 SAM) 离线建Tire树,BFS 序增量建立SAM
多个串建SAM:参考https://www.cnblogs.com/Xing-Ling/p/12038349.html。把多个串离线存到tire树上,然后每个点的last是bfs树中父亲的cur。然后建立SAM,其余与普通的SAM相同。#include<bits/stdc++.h>#define ll long longusing namespace std;const int M=1e6+7;struct Trie{ int O,c[M],fa[M],tr[原创 2020-09-30 20:36:15 · 163 阅读 · 0 评论 -
P3804 【模板】后缀自动机 (SAM) 字串在原串中出现次数
#include <bits/stdc++.h>using namespace std;typedef long long ll;const int M = 1e6+7;int head[2*M],cnt=1;//点集大小是2被的字符串长度 void init(int n){cnt=1;for(int i=0;i<=n;i++)head[i]=0;}struct EDGE{int to,nxt,w;}ee[2*M*2];void add(int x,int y,int...原创 2020-09-30 16:34:53 · 418 阅读 · 0 评论 -
#1449 : 后缀自动机三·重复旋律6 后缀自动机 某个长度的字串,在原串中出现的次数的最大值
先用SAM建出的后缀树的性质,求出每个endpos集合的大小。然后用线段树或线性更新求出每个长度出现次数的最大值即可。#include <bits/stdc++.h>using namespace std;typedef long long ll;const int M = 1e6+7;int head[2*M],cnt=1;//点集大小是2被的字符串长度 void init(int n){cnt=1;for(int i=0;i<=n;i++)head[i]=0;}原创 2020-09-30 16:15:51 · 146 阅读 · 0 评论 -
#1445 : 后缀自动机二·重复旋律5 后缀自动机 本质不同字串个数
一般来说有两种方法做这道题:方法一:SAM建出满足后缀自动机性质的DAG。显然上述是对的,因为这个DAG上每条从S到任意点路径上组成的字符串,都是原串的子串,根据字典树的性质,显然所有路径中不会有相同的字串。而根据后缀自动机节点的性质:每个节点表示一个endpos集合,集合内包含的字符串个数为:maxlen[i] - minlen[i] +1而包含的字符串刚好是到达该点路径组成的字符串。而SAM过程中我们记录了maxlen,minlen就等于 maxlen[link[i]]+1原创 2020-09-30 12:26:08 · 168 阅读 · 0 评论 -
2020牛客暑期多校训练营(第一场) A B-Suffix Array 后缀数组
显然每个后缀只有第一次出现ab的的前面不同。要么是 ab要么是aaaaab,bbbbba要么是aaaa,bbbbO1判断,后面的部分用rank比较即可#include <bits/stdc++.h>using namespace std;typedef long long ll;const int M = 1e6+7;struct suffix_array{ int str[M],sa[M],rank[M],t1[M],t2[M],c[M]; //原创 2020-08-22 12:18:21 · 174 阅读 · 0 评论 -
后缀数组 模板(结构体) DC3 与倍增
DC3#include <bits/stdc++.h>using namespace std;typedef long long ll;const int M = 1e6+7;struct suffix_array{ int str[M],sa[M],rank[M],t1[M],t2[M],c[M]; //int lg2[M];int rmq[21][M],height[M]; //sa[i],排名i(1-n)后缀的起始下标(0 - n-1) //原创 2020-08-21 17:50:36 · 23002 阅读 · 0 评论 -
ICPC North Central NA Contest 2018 A. Pokegene 后缀数组解法
陆陆续续调了3天上午,终于调出来了。这题题解给的代码是错的。错在:每个字符要加上一个'\0',这样可以处理:bb,bba这种情况.下面说下这题的思路:先不考虑算法。对于一个询问,把k个字符串进行按字典序排序。位置相近的字符串肯定LCP越大。所以恰好L个字符串有LCP,且其他没有,一定是排序后的连续L个。我们排序后枚举每个位置[i,i+L-1]看看LCP(i...原创 2020-05-05 11:36:43 · 201 阅读 · 2 评论 -
后缀数组模板+LCP小证明
复习了一遍后缀数组:https://www.cnblogs.com/victorique/p/8480093.html#autoid-1-3-2关于LCP的性质,之前理解的是错的,看了这篇blog重新证明了下。另外:LCP(i,j)其实就是LCP(i,i+1,i+2……,j)即连续L个后缀的LCP#include<cstdio>#include<cstri...原创 2020-05-03 21:41:52 · 329 阅读 · 0 评论 -
#1445 : 后缀自动机二·重复旋律5 后缀自动机板子题
板子题。。/*问题1.给定文本T,询问格式如下:给定字符串P,问P是否是T的子串。问题2.给定字符串S,问它有多少不同的子串。(模板中的GetSubNum函数)问题3.给定字符串S,求其所有不同子串的总长度。问题4.给定字符串S,一系列询问——给出整数K_i,计算S的所有子串排序后的第K_i个。问题5.给定字符串S,找到和它循环同构的字典序最小字符串。问题.给定文本T,询问格式如...原创 2019-09-18 22:14:50 · 171 阅读 · 0 评论 -
POJ - 2774 后缀数组 Height数组模板
求2个字符串最长公共字串。先合并2个字符串一定是Height[i],且sa[i],sa[i-1]分别在2个字符串的位置,就一定是公共字串。为什么呢?首先我们先合并,(注意:在第一个字符串后面加一个不再范围内的字符,隔开2个字符,这样两个字符串的最长公共字串就转化成了新的字符串后缀的最长公共前缀(满足2个后缀分别在2个字符串原来的位置)。我看很多人没加分隔符,那这组数据就能hack:...原创 2019-08-28 13:16:43 · 251 阅读 · 3 评论 -
P3809 【模板】后缀排序
学完后缀数组后第一个模板题后缀中:sa[i] : 开头为i的后缀rak[i]:排名为i的后缀的开头位置#include<cstdio>#include<cstring>#include<algorithm>const int MAXN = 1e6 + 10;using namespace std;char s[MAXN];int ...原创 2019-08-28 12:38:26 · 180 阅读 · 0 评论 -
后缀数组学习笔记
https://www.cnblogs.com/victorique/p/8480093.html学习了这篇bolgLCP LemmaLCP(i,k)=min(LCP(i,j),LCP(j,k)) 对于任意1<=i<=j<=k<=n感觉直接想也能想到这个证明,就是suff(sa[i]),suff(sa[k])的最长公共前缀,而suff(sa[i])与su...原创 2019-08-26 20:06:10 · 94 阅读 · 0 评论