首页 > TAG信息列表 > NQ

109 后缀自动机(SAM)

视频链接:                         P3804 【模板】后缀自动机 (SAM)。 // Luogu P3804 【模板】后缀自动机 (SAM) #include <iostream> #include <cstring> #include <algorithm> using namespace std; typedef long long LL; const int N=2e6+10; int h[N], e[N],

广义SAM

参考 还有首先你要会SAM吧~ 用途 相比与单串SAM,广义自动机能存储的是多个字符串。 有两种写法,第一种是离线利用trie树结构,第二种是在线伪广义SAM 离线+Trie 首先构建出trie树。 然后在trie树上BFS(),用\(pos[u]\)映射trie树上\(u\)节点对应SAM上的节点。 为什么不dfs,因为时间

模板整理

SAM: 点击查看代码 namespace SAM { struct qq{int son[26],pre,step;}s[N*2];int tot,Last; LL g[N]; void Init () {tot=Last=1;memset(s,0,sizeof(s));memset(g,0,sizeof(g));} vector<int> vec[N]; int r[N]; void ins (int x) { int p=Last,np=++tot; s[np].

【CF666E】Forensic Examination

题目 题目链接:https://codeforces.com/problemset/problem/666/E 给你一个串 \(S\) 以及一个字符串数组 \(T_{1\ldots m}\),\(q\) 次询问,每次问 \(S\) 的子串 \(S[p_l\ldots p_r]\) 在 \(T_{l\ldots r}\) 中的哪个串里的出现次数最多,并输出出现次数。 如有多解输出最靠前的那一个。

P4070 [SDOI2016]生成魔咒 - SAM

这是一道板子题,考的是一个状态中不同子串数量为len[i] - len[fa[i]],即集合中最长的后缀减去最短的后缀。 不过这题我遇到的问题在于字符集过于庞大,最后是通过用map去代替ch数组解决。 // // Created by acer on 2021/2/16. // //判断子串,不同子串个数,所有子串字典序第i大,最长

leecode743:网络延迟时间

题目描述 有 n 个网络节点,标记为 1 到 n。 给你一个列表 times,表示信号经过 有向 边的传递时间。 times[i] = (ui, vi, wi),其中 ui 是源节点,vi 是目标节点, wi 是一个信号从源节点传递到目标节点的时间。 现在,从某个节点 K 发出一个信号。需要多久才能使所有节点都收到信号?如

Linux Makefile模板

转载自: https://www.latelee.org/compilelinking/Makefile-template.html 许久以前,一直使用自己总结的Makefile模板,这个模板也是基于现有资料整理而成的。 一、内容 Makefile完全内容如下: # !!!=== cross compile... CROSS_COMPILE ?= CC = $(CROSS_COMPILE)gcc CXX = $(

后缀自动机学习笔记

作用 后缀自动机\((SAM)\)是一个能解决许多字符串相关问题的有力的数据结构 它可以把一个字符串的所有子串都表示出来 而且从根出发的任意一条合法路径都是该串中的一个子串 构造 要表示一个字符串所有的子串,最简单的方法是对于所有的子串建一棵字典树 但是这样做时间复杂度和空间

CF204E-Little Elephant and Strings【广义SAM,线段树合并】

正题 题目链接:https://www.luogu.com.cn/problem/CF204E 题目大意 \(n\)个字符串的一个字符串集合,对于每个字符串求有多少个子串是这个字符串集合中至少\(k\)个字符串的子串。 解题思路 因为对于每个字符串我们需要维护的信息不同,不能累加,所以考虑使用线段树合并。 先将\(n\)个

CF235C-Cyclical Quest【SAM】

正题 题目链接:https://www.luogu.com.cn/problem/CF235C 题目大意 一个文本串\(s\)。询问\(n\)个匹配的本质不同的循环同构在文本串中出现了几次。 解题思路 我们匹配完原串之后,相当与每次在头部删去一个字符然后又在末尾加上一个字符。使用\(SAM\)匹配的话,发现每次在\(parents

CF235C-Cyclical Quest【SAM】

正题 题目链接:https://www.luogu.com.cn/problem/CF235C 题目大意 一个文本串 s s s。询问 n n n个

[学习笔记] 后缀自动机

其实我后缀自动机在 \(2020/2\) 的时候就会了,刷了很多题,但是一直没有搞懂原理,现在补一发关于后缀自动机原理的博客。我尽量节约时间,把最重要的东西写的尽量好理解。 我是看这位巨佬的博客学的,所以会有一些重合的地方,但是我会按照我自己的理解写(仔细看你会发现我们的表述相差很大),争

P5546-[POI2000]公共串【SAM】

正题 题面链接:https://www.luogu.com.cn/problem/P5546 题目大意 求 n n n个串的最长公共子串。 解题思路 注意到最长公共子串一定是其中所有的子串,所以我们可以先随意对一个串构建

A Piece Of Cake

nit yqmg mqrqn bxw mtjtm nq rqni fiklvbxu mqrqnl xwg dvmnzxu lqjnyxmt xatwnl, rzn nit uxnntm xmt zlzxuuk mtjtmmtg nq xl rqnl. nitmt vl wq bqwltwlzl qw yivbi exbivwtl pzxuvjk xl mqrqnl rzn nitmt vl atwtmxu xamttetwn xeqwa tsftmnl, xwg nit fzruvb, nixn mqrq

LuoguP5576 [CmdOI2019]口头禅 后缀树+线段树+暴力

一个比较暴力的解法.   先对所有串建出广义后缀自动机提取出后缀树然后按照询问的右端点离线.    考虑插入第 $i$ 个串,那么会被 $i$ 及 $i$ 的祖先遍历到的点的表示范围会从 $[l,r] \rightarrow [l,r+1]$.    未被遍历到的点的表示范围出现了一个“断点”,则表示范围就是 $i$

算法训练 自行车停放

#算法训练 自行车停放 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述   有n辆自行车依次来到停车棚,除了第一辆自行车外,每辆自行车都会恰好停放在已经在停车棚里的某辆自行车的左边或右边。(e.g.停车棚里已经有3辆自行车,从左到右编号为:3,5,1。现在编号为2的第4辆自行

Luogu P4022 [CTSC2012]熟悉的文章

广义 \(SAM\) + 二分答案 + 单调队列优化 \(DP\) 对作文库建广义 \(SAM\) ,然后求出作文每个位置的最长匹配 \(d[i]\),然后二分答案 \(md\),然后 \(DP\) ,\(f[i]\) 表示到 \(i\) 的最大匹配长度,有 \(f[i]=\max(f[j]-j+i),j\in[i-d[i],i-md]\),最后检查 \(f[n]\geq 0.9\times len\) #inc

Luogu P4070 [SDOI2016]生成魔咒

题意:求本质不同的子串数。 \(SA\) \(SAM+DP\) 答案即为路径条数。 我们设 \(f[u]\) 表示从 \(u\) 出发的路径条数:\(f[u]=1+\sum_{(u,v,ch)} f[v]\) ,其中 \(1\) 代表空串。 最后答案即为 \(f[0]-1\) \(SAM+parent树\) 每个子串只会出现一次,并且每个点的 \(sz\) 即为 \(maxlen[u]-mi

BZOJ 3796: Mushroom追妹纸 后缀自动机+拓扑排序+DP

就是喜欢后缀自动机,yy了一个只用后缀自动机解决的方法.    对 3 个串建立广义后缀自动机,然后建立后缀树.   标记出每个点在0/1/2个串中是否作为子串出现,然后将后缀树中 2 串结尾的所有子树都设为危险节点.   然后对于 SAM 来一个拓扑序DP,我们开始的时候默认危险节点的最大值

「专题总结」后缀自动机SAM

多数题目都是套路。用到的技巧在我的垃圾讲解里多少也有涉及。 当然也是有大神题的。。。 因为7道题之前就做过(品酒大会在题库刷3倍经验的时候不小心水掉了) 然后剩下3道都是大神题。。。根本做不动。。。 至少现在套路应该也都会了,也算是捡回来了吧   弦论: $Description:$ 对于

PAT乙级题库“傻瓜”题解之判断题

判断题的评判很简单,本题就要求你写个简单的程序帮助老师判题并统计学生们判断题的得分。 输入格式: 输入在第一行给出两个不超过 100 的正整数 N 和 M,分别是学生人数和判断题数量。第二行给出 M 个不超过 5 的正整数,是每道题的满分值。第三行给出每道题对应的正确答案,0 代表“非”,1

【BZOJ1396/2865】识别子串(SAM)(线段树)

传送门 题解: 建出SAM,能够用来更新答案的是right集合大小为1的,也就是叶子节点,也就是原串的每个位置的代表节点。 考虑节点iii,显然[len[fa[i]]+1,len[i]][len[fa[i]]+1,len[i]][len[fa[i]]+1,len[i]]这段区间可以直接被len[fa[i]]+1len[fa[i]]+1len[fa[i]]+1更新。 然后对于

后缀自动机总结

后缀自动机,是一个能识别一个字符串的所有后缀的自动机。 考虑一种最简单的实现: 将一个字符串的所有后缀插入到一棵trie中。 如图: 可以发现后缀树每个点对应一个后缀集合,每个点对应的后缀集合是这个点子树中所有结束节点所表示的后缀的集合。 把每个点对应的后缀集合称为righ(x) 由

【SAM】BZOJ5137 [Usaco2017 Dec] Standing Out from the Herd

【题目】 lydsy 给定nnn个字符串,对于每个字符串,问只在这个字符串中出现的子串有多少个。 n,∑∣S∣≤105n,\sum|S|\leq 10^5n,∑∣S∣≤105 【解题思路】 随便写写板子吧。 建出广义SAM\text{SAM}SAM后自下而上合并right\text{right}right集合即可,实现时就是给每个结束节点打

bzoj 4032: [HEOI2015]最短不公共子串【dp+SAM】

第一、二问: 就是最小的最长公共长度+1,设f[i][j]为a匹配到i,b匹配到j,第一问的转移是f[i][j]=(a[i]==b[j]?f[i-1][j-1]+1:0),第二问的转移是f[i][j]=(a[i]==b[j]?f[i-1][j-1]+1:f[i][j-1]),注意这里更新最小公共长度的时候,如果f[i][j]==i就不能更新,因为不能从前面随便新加的字符,后面加的