后缀自动机
文章平均质量分 62
DZYO
Never stop
展开
-
子串计数 (广义后缀自动机模板)
子串计数 (广义后缀自动机模板)原创 2017-03-21 17:00:12 · 1055 阅读 · 0 评论 -
后缀自动机详解
原论文(俄文)地址:suffix_automata 后缀自动机 后缀自动机(单词的有向无环图)——是一种强有力的数据结构,让你能够解决许多字符串问题。例如,使用后缀自动机可以在某一字符串中搜索另一字符串的所有出现位置,或者计算不同子串的个数——这都能在线性时间内解决。 直觉上,后缀自动机可以被理解为所有子串的简明信息。一个重要的事实是,后缀自动机以压缩后的形式包含了一...翻译 2017-03-26 11:34:54 · 42608 阅读 · 16 评论 -
BZOJ3277: 串 (广义SAM)
传送门题解: 后缀数组的做法就不说了,又慢又长。考虑后缀自动机,把这几个串同时拿出来搞。多个串怎么建呢? 一种方法是直接每个字符中串一个字符,不过这样会导致字符集变大,还有一种方法是直接每次暴力重置last为root,插入的时候判一下是否有转移。我们还要统计一个点对于每个串的出现次数,这个也有两种方法,一种是离线之后用树状数组搞,具体细节就不说了。 还有一种复杂度不知道正不正确的原创 2018-01-29 20:43:16 · 508 阅读 · 0 评论 -
BJ模拟:最长公共前缀(SAM+虚树)
传送门题意: BZOJ3879的树上版本。题解: 实际上我们也可以维护后缀数组做,只需要多一个后缀平衡树。不过这道题建广义SAM更方便,因为Trie树上所有节点到根的路径都是后缀,我们只需要把SAMSAMSAM建出来即可得到后缀树,两个串的lcp为在后缀树上的lca的长度,然后每次询问建虚树DPDPDP即可。不过需要注意的是trie树上建SAMSAMSAM的复杂度是错的,所以还...原创 2018-04-10 10:51:47 · 465 阅读 · 0 评论 -
BJ模拟:String(SAM+LCT+主席树)
传送门题意: 给字符串SSS,支持: 1.末尾加入字符。 2.查询[l,r][l,r][l,r]中出现两次的最长字符串。题解: 好题。考虑离线做法: 动态插入后面的字符,更新前面lll的答案。当我们插入一个字符rrr的时候,与前面的公共子串为它的后缀。 我们考虑暴力跳failfailfail链来更新答案: 每个位置记last表示endpos的最后一个位置,那么这个位置能...原创 2018-04-11 11:56:56 · 409 阅读 · 0 评论 -
HDU6138:Fleet of the Eternal Throne(后缀自动机)
传送门题解: 每次询问时对询问的两个串xx和yy分别做: 建后缀自动机,求出每个串是这个串的子串的最长前缀。 每个串对xx和yy的答案取min,所有串的答案取max即可。 时间复杂度O(nm)O(nm)#include <bits/stdc++.h>using namespace std;const int N=1e5+50;char ch[N];int n...原创 2018-03-28 20:36:44 · 243 阅读 · 0 评论 -
BJ模拟:Mr. Panda and Fantastic Beats(广义SAM)
传送门题解: 对所有串建广义SAM,我们可以知道每个串是否只在1出现。 然后在SAM上贪心即可。#include <bits/stdc++.h>using namespace std;const int N=5e5+50, L=26;int son[N][L],len[N],fail[N],id[N],mx[N],mn[N],mnlen[N],lst,tot;i...原创 2018-05-05 10:44:25 · 379 阅读 · 0 评论 -
BZOJ1921: [Ctsc2010]珠宝商(点分治+SAM)
传送门题解:点分治,如果点数≥n\ge \sqrt{n}≥n,则结合后缀树O(sze+m)O(sze+m)O(sze+m)处理出每个位置的开始,结束点并统计答案。否则从每个点开始暴力扩展路径。时间复杂度O(nn)O(n \sqrt{n})O(nn)。#include <bits/stdc++.h>using namespace std;typedef pair <...原创 2018-09-20 15:05:37 · 358 阅读 · 0 评论 -
BZOJ3676: [Apio2014]回文串(后缀自动机+manacher/回文自动机)
传送门 题意: 给一棵树,每次给一些点增加点权,求一个点,使得∑j≠idis(i,j)∗val[j]\sum\limits_{j\not = i}dis(i,j)*val[j]最小,输出最小值。题解:动态树分治官方题解已经讲得很清楚了: 首先我们假设每次操作过后我们可以快速地在线查询以任意一个点为关键点得到的权值和,那么在这种情况下如何求出最小权值? 为了表达方便,我们不妨原创 2017-09-11 11:51:39 · 548 阅读 · 0 评论 -
bzoj 3998 弦论(后缀自动机, 后缀数组)
弦论(BZOJ 3998) 题目大意: 对于给定的一个长度为n 的字符串S,求其第k 小的子串。询问有两种,一种只统计本质不同的子串,另一种统计位置不同的子串。 n < 5e5 , k <10e9 分析: SAM解法建出S 的后缀自动机,随后在自动机所形成的拓扑图上预处理每条边所能到达的子串个数,询问时按字典序枚举边尝试往下走即可 因为每条路径对应的字符串唯一。 对于本质不同子串,原创 2017-03-20 11:34:53 · 507 阅读 · 0 评论 -
BZOJ2946 SPOJ1812:Longest Common Substring II(后缀自动机)
DescriptionA string isfinite sequence of characters over a non-empty finite set Σ.In this problem,Σ is the set of lowercase letters.Substring, alsocalled factor, is a consecutive sequence of cha原创 2017-03-25 11:11:43 · 753 阅读 · 0 评论 -
bzoj2555: SubString(后缀自动机+动态树)
Description 懒得写背景了,给你一个字符串init,要求你支持两个操作 (1):在当前字符串的后面插入一个字符串 (2):询问字符串s在当前字符串中出现了几次?(作为连续子串) 你必须在线支持这些操作。 Input 第一行一个数Q表示操作个数原创 2017-03-26 11:26:36 · 430 阅读 · 0 评论 -
spoj8222:Substring(后缀自动机+拓扑排序)
You are given a string S which consists of 250000 lowercase latin letters at most. We define F(x) as the maximal number of times that some string with length x appears in S. For example for string 'ab原创 2017-03-25 21:20:50 · 515 阅读 · 0 评论 -
spoj7258:Lexicographical Substring Search(后缀自动机+拓扑排序)
Little Daniel loves to play with strings! He always finds different ways to have fun with strings! Knowing that, his friend Kinan decided to test his skills so he gave him a string S and asked him Q q原创 2017-03-26 09:03:30 · 700 阅读 · 0 评论 -
bzoj3926:[Zjoi2015]诸神眷顾的幻想乡(后缀自动机)
Description幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日。 粉丝们非常热情,自发组织表演了一系列节目给幽香看。幽香当然也非常高兴啦。 这时幽香发现了一件非常有趣的事情,太阳花田有n块空地。在过去,幽香为了方便,在这n块空地之间修建了n-1条边将它们连通起来。也就是说,这n块空地形成了一个树的结构。 有n个原创 2017-04-04 21:32:48 · 335 阅读 · 0 评论 -
poj1509:Glass Beads(后缀自动机)
DescriptionOnce upon a time there was a famous actress. As you may expect, she played mostly Antique Comedies most of all. All the people loved her. But she was not interested in the crowds. Her big ho原创 2017-05-06 20:25:00 · 373 阅读 · 0 评论 -
SPOJ1812:Longest Common Substring(后缀自动机)
传送门 给两个字符串,求其最长公共子串题解:后缀自动机。考虑后缀自动机的link指针,指向比当前子串长度小的子串后缀(有点类似AC自动机的fail)。匹配的时候同AC自动机,不过调fail时将当前长度置为当前状态的len值(因为是前一个字符串的后缀,所以都可以匹配)。#include<bits/stdc++.h>#include<vector>using namespace std;co原创 2017-08-28 19:26:43 · 394 阅读 · 0 评论 -
UOJ#395. 【NOI2018】你的名字(SAM)
传送门题解:线段树维护fail树,然后t串暴力在s串fail树上跳,对每个后缀求出重合最多的一部分,然后自己再求一次即可。时间复杂度O(nlogn)O(n\log n)O(nlogn)。#include <bits/stdc++.h>using namespace std;const int N=1e6+50;struct SAM { char ch[N]; i...原创 2018-10-08 11:06:09 · 526 阅读 · 0 评论