Suffix-Autonmation
Cold_Chair
我XXX就是饿死,死外边,从这里跳下去,也不会再做你九条可怜一个测试点
展开
-
SPOJ LCS2 - Longest Common Substring II
原题链接.题解:变成了多个串的最长公共子串了。还是对一个串建后缀自动机。其它的串放上去跑。对于每个状态求一个最小值,最后答案求一个最大值就行了。但是注意在匹配过程中,匹配到一个状态,但是实际上有很多状态也被匹配到了,考虑这种情况一个状态的值需要传递给它的parent。这个可以全部求出后按Turpo序来搞。为什么只传给parent是对的呢?后缀自动机有一个性质: 两个子串的最长公共后缀为它们对应状态原创 2017-12-08 19:57:32 · 288 阅读 · 0 评论 -
【GDOI2019模拟2019.2.23】字符串
Description:题解:首先思考一个经典的问题怎么做?就是求一个串的子串的不同子串数,这玩意儿冬令营上《字符串前沿算法》讲过。考虑在把整个串的SAM建出来,注意建的时候记录每个结尾点。然后一个一个把结尾点激活,之所以要先建出来的原因是树的形态就稳固了。假设要查询[l…r]的不同子串数,先把r以前的结尾点激活。如果知道每个点的rmax,这个点的深度代表的是[x…y],那么就给...原创 2019-02-24 22:35:54 · 319 阅读 · 0 评论 -
【GDOI2016模拟3.14】hashit
CLJ的题,本来是道后缀平衡树的裸题,先用广义后缀自动机艹过去,之后再补。题目大意:有一个字符串,每次要支持后端插入和后端删除,问操作完后该串不同子串的个数。题解:首先搞成一个trie,然后建广义SAM。然后考虑利用SAM去求不同子串个数。我们知道对于两个trie的两个前缀,它们的lcs就等于它们两个点在SAM上的结尾点在SAM上的lca的深度。因此可以自上而下扫trie,现在相当于...原创 2018-10-24 22:16:18 · 256 阅读 · 0 评论 -
bzoj2555: SubString
传送门.算是一下复习了两个算法。题解:建出后缀自动机,然后相当于有删边,有加边,动态维护一个点的子树里有多少个结尾的点。可以直接用lct维护子树和,或者ett维护。注意一棵有根树,其实只用lct维护路径和应该是最简单的。Code:#include<cstdio>#include<cstring>#include<algorithm>#defi...原创 2018-10-21 11:48:17 · 245 阅读 · 0 评论 -
platform(SA +线段树二分 or 后缀树+倍增)
Description:题解:有一个非常显然(并不)的结论。就是每一个后缀只有至多一个前缀满足条件。因为对于一个后缀的所有前缀来说来说,随着长度的增加,排名递减,但是val的和不递增,因此只有一个。很容易想到对于每一个后缀二分一下,现在问题在于如何求一个子串的rank?去重?这不是SAM干的事?可是直接用SAM复杂度就乘了n。SAM的fail链就形成原串的反串的...原创 2018-08-16 19:54:18 · 327 阅读 · 0 评论 -
口胡 2018.03.10【GDOI2018】模拟A组
那天我去了象征自由的组别,没有做这个组,但是这个组的题目还是很有意思的。看了之后有很大启发,所以写一下。T1【NOI2015模拟12.27】str:Description:第一问一看是个回文自动机的裸题。但是你发现第二问用回文自动机有点难搞。转换后相当于把一棵trie反过来求第k大。因为后缀自动机的fail边是原串反向前缀树。于是可得广义后缀自动机得fa...原创 2018-03-16 12:24:49 · 383 阅读 · 0 评论 -
【TJOI2013】单词
Description:小张最近在忙毕业设计,所以一直在读论文。一篇论文是由许多单词组成的。 但小张发现一个单词会在论文中出现很多次,他想知道每个单词分别在论文中出现了多少次。 单词数不超过200 单词总长度不超过1000000题解:这题我能想到的做法有三个。第一个是最朴素的AC自动机。我们需要清楚知道AC自动机的fail链的定义:走到x所代表的字符串有出现的最长的一个后缀。在原trie上往子原创 2018-01-19 21:09:18 · 472 阅读 · 0 评论 -
【WC2016模拟】String
Description:题解:一眼就是在后缀树上乱搞。仔细思考可以用dsu on tree+线段树来维护,常数巨小。nilil说用后缀数组+Cdq分治+线段树。大概是这样: 对于一个区间[x..y],设m=(x+y)/2那要求跨过m的两个点的答案。可以设l,r。l往左边扫过去,得到一个到终点的height的min值。同时r往右边调。使r到m的height的min值小于等于l的。反着做一遍。r往右边原创 2017-12-30 07:13:14 · 571 阅读 · 0 评论 -
【NOI2017模拟6.2】字符串
Description: 1<=n<=10^6,1<=∑|S|\sum|S|<=10^6题解:不同子串肯定和后缀自动机有关。对每个串搞出后缀自动机。关键在于如何合并这些玩意。倒着做。设fxf_x表示到x状态往后搞的不同串的方案数。可以枚举它的下一个字符是什么,如果自动机里有边,就可以直接走过去传递。 如果没有,可以找到后面的自动机中第一个root有这个字符的对应的状态,从那里转移。答案就是所以最原创 2017-12-15 18:24:07 · 304 阅读 · 0 评论 -
后缀自动机学习小记
前言:我学习这个东西吧是很懵的,结合了多篇论文和博客才搞懂最基础的构建,需要细细琢磨。推荐论文:陈立杰冬令营上的论文,有些小错误,而且我讨厌指针。 张天扬集训队的论文,里面讲了许多应用。推荐博客:后缀自动机学习总结——functioner.后缀自动机的定义:我也没搞清楚。 有限状态自动机的就是能识别字符串。 而后缀自动机就能识别一个字符串的所有后缀,当然同时能识别子串。后缀自动机的构建:一个显原创 2017-12-06 20:41:28 · 390 阅读 · 0 评论 -
【GDOI2017 day1】微信
题目大意:给出20棵trie。每次询问问某几棵trie的子串的lcs。总长小于10^6。题解:已经退役的wyx当时说:“又是裸题,真没意思。”呵呵。可惜初二的我连后缀自动机是什么都不知道,只会那个弱弱的AC自动机。如果没有每次的询问,那么这个跟SPOJ的lcs2没有什么区别,这个只是广义后缀自动机。前一篇博客已经讲过,广义后缀自动机和正常的真的没有毛线区别。现在重点在于每次询问某几棵怎么办?只有20原创 2017-12-12 22:06:49 · 335 阅读 · 0 评论 -
【ZJOI2015】诸神眷顾的幻想乡(广义后缀自动机)
题目大意:有一棵有n个节点的树,每个节点上有一个数字。 求所有树的路径中,所形成的字符串中不同的有多少个。 1<=n<=10^5 叶子节点数小于20。题解:其实我很不解一个裸的不能再裸的题为什么会是ZJOI Day1 的最后一题。也许是因为后缀自动机2012年才提出来吧。首先注意叶子节点数小于20。这启发我们以它们为根,去建树,这样会有20个trie,再合并,就有一棵大tried。现在的问题在原创 2017-12-11 22:07:36 · 580 阅读 · 0 评论 -
hdu 4622 Reincarnation
原题链接.题目大意:给出一个字符串。 求它的一个子串的不同子串有多少个。 多组询问。 1<=n<=2000题解:显然可以离线。枚举左端点,往后用后缀自动机直接搞就行了。但是有个问题: 如何知道每次新加了多少条路径?注意到对一个状态有一个性质: root到状态x的路径长度在(step[parent[x]],step[x]]这个范围。而且好像区间内每个长度的路径数只有一条,这个我还没有搞明白。原创 2017-12-08 21:02:17 · 266 阅读 · 0 评论 -
SPOJ LCS - Longest Common Substring
题目链接.题解:后缀自动机的例题。首先要知道一个性质: 一个状态s,所能代表的子串长度是(stepparentx,stepx](step_{parent_x},step_x]。对串A建后缀自动机。串B在上面跑。如果x有对应的子节点,那么直接走过去,len ++如果当前的x状态上没有对应的子节点,那就x = parent[x],直到有对应的子节点或者出了自动机。出了自动机,len = 0,注意把x赋原创 2017-12-08 19:15:29 · 288 阅读 · 0 评论 -
【NOI2018】你的名字
题目大意:一开始给出字符串S。Q次询问,每次给出l,r和字符串T。问T有多少不同子串不是S[l…r]的子串。∑∣T∣&lt;=1e6,∣S∣,∣T∣&lt;=5e5\sum|T|&lt;=1e6,|S|,|T|&lt;=5e5∑∣T∣<=1e6,∣S∣,∣T∣<=5e5题解:不同子串一类问题优先考虑SAM。感觉这题考的更多是对SAM的理解。...原创 2019-03-04 16:43:47 · 984 阅读 · 0 评论