Processing math: 100%

随笔分类 -  字符串之后缀自动机

摘要:题意:给串s和t,对于串s每个位置有一个价值f,两种操作1.修改f[a]=b,2.查询串t子串Ta b在s的子串Sc d中出现位置的f和 题解:s和t建sam,把fail树按dfs序建bit套线段树,就变成了单点修改,子树(区间)查询区间个数 阅读全文
posted @ 2019-04-25 13:44 walfy 阅读(191) 评论(0) 推荐(0) 编辑
摘要:题意:有n个串,询问每个串有多少子串在n个串中出现了至少k次. 题解:sam,每个节点开一个set维护该节点的字符串有哪几个串,启发式合并set,然后在sam上走一遍该串,对于每个可行的串,所有的fail都是可行的直接加上len,不可行就往fail上跳. ~~for(int i=0;s[i];i++ 阅读全文
posted @ 2019-04-22 14:31 walfy 阅读(144) 评论(0) 推荐(0) 编辑
摘要:题意:给n个串ti,ps,i是s在ti中出现的次数,要求找到s,使得ni=1cips,i|s|最大 题解:sam裸题,每次插入时相当于在fail链上到1的位置加ci,最后统一乘该节点状态的长度,我居然写了个lct维护!= =还wa了....后来发现打个标记topo一下 阅读全文
posted @ 2019-04-19 11:28 walfy 阅读(139) 评论(0) 推荐(0) 编辑
摘要:题意:给串s,每次询问k个数a,l个数b,问a和b作为后缀的lcp的综合 题解:和bzoj3879类似,反向sam日神仙...lcp就是fail树上的lca.把点抠出来建虚树,然后在上面dp即可.(感觉之前写的svt什么玩意) 阅读全文
posted @ 2019-04-18 21:13 walfy 阅读(126) 评论(0) 推荐(0) 编辑
摘要:题意:给3个字符串,问从1到min(l1,l2,l3)的长度的子串,找到从该位置长度为l,三个子串相同的三元组的个数 题解:把3个子串用分隔符串起来.然后分开统计每个节点在三个串中出现次数.最后乘起来就是该节点表示的三元组个数,然后l[fa[i]]+1到l[i]有贡献,对l差分一下就好了 // pr 阅读全文
posted @ 2019-04-16 20:24 walfy 阅读(190) 评论(0) 推荐(0) 编辑
摘要:题意:给你一个字符串s有一些位置被ban了,字符串t的价值是|t| t在s中出现次数而且终点没有被ban.问你最大的价值是多少 题解:很明显t是s子串,建个sam,对于sam中每个位置,我们需要删除中点被ban的次数,只需要在sam上走一遍,到被ban的点时需要更新fa链,打个标记,根据topo序差 阅读全文
posted @ 2019-04-16 13:04 walfy 阅读(141) 评论(0) 推荐(0) 编辑
摘要:题意:给你n个01字符,每次问你前缀的所有本质不同的子串,由摩斯密码组成的方案数和. 题解:离线处理,把字符建sam,通过topo序来dp计算每个节点表示的子串方案数的和.统计答案时,把n个字符挨个匹配过去,把所有经过的节点加上方案数,还有每个节点的fa链,也要统计(因为是当前串的后缀),用一个vi 阅读全文
posted @ 2019-04-16 10:56 walfy 阅读(168) 评论(0) 推荐(0) 编辑
摘要:题意:定义一个串合法,在n个串中出现次数在li到ri中.问s的所有本质的子串有是多少合法的 题解:把所有串用分隔符分开建sam,记录一个该节点对应每个串的出现次数,topo排序后,当该节点s出现次数不为0,而且其他串出现次数满足条件,那么该节点对应的所有子串都满足条件(因为后缀相同,在同一个串中出现 阅读全文
posted @ 2019-04-15 14:58 walfy 阅读(143) 评论(0) 推荐(0) 编辑
摘要:题意:给你一个字符串,找第k大的子字符串.(考虑相同的字符串) 题解:建sam,先预处理出每个节点的出现次数,然后处理出每个节点下面的出现次数,然后在dfs时判断一下往哪边走即可,注意一下num会爆int // pragma GCC optimize(2) // pragma GCC optimiz 阅读全文
posted @ 2019-04-14 17:02 walfy 阅读(103) 评论(0) 推荐(0) 编辑
摘要:题意:给你一个子串,m次询问,每次给你abcd,问你子串sa b的所有子串和子串sc d的最长公共前缀是多长 题解:首先要求两个子串的最长公共前缀就是把反过来插入变成最长公共后缀,两个节点在parent树上的lca就是最长公共后缀.找到某个子串就是在parent树上倍增 我们先二分答案,问题就变成了 阅读全文
posted @ 2019-04-12 09:31 walfy 阅读(242) 评论(0) 推荐(0) 编辑
摘要:题意:给一个初始串s,和m个模式串,q次查询每次问你第l到第r个模式串中包含slsr子串的最大数量是多少 题解:把初始串和模式串用分隔符间隔然后建sam,我们需要找到在sam中表示slsr子串的状态节点(先找到sr对应的节点,然后倍增parent树即可),我们需要找到包含$ 阅读全文
posted @ 2019-04-07 13:42 walfy 阅读(148) 评论(0) 推荐(0) 编辑
摘要:题意:给一颗字典树,m次查询,每次给出一个字符串,问你该字符串是字典树上多少串的后缀 题解:字典树求广义sam,每次把查询串在sam上跑一遍,最后到达的点的sz就是答案,中途没法走了,就是没有出现过 // pragma GCC optimize(2) // pragma GCC optimize(3 阅读全文
posted @ 2019-04-06 14:20 walfy 阅读(602) 评论(0) 推荐(0) 编辑
摘要:题意:给你n个字符串,m次查询,每次问你第p个字符串的s到t的字符串在n个字符串建成的字典树上出现了多少次 题解:先建出字典树,在字典树上拓展sam,记录每个子串的出现次数.查询时只需找出在字典树上的t在sam中的位置,每次往fa跳(即后缀相同,长度减小)找到第一个长度比查询串的小于等于的位置就是答 阅读全文
posted @ 2019-04-06 13:50 walfy 阅读(181) 评论(0) 推荐(0) 编辑
摘要:题意:有棵树每个点有个颜色(不超过10种),每个节点不超过20个儿子,问你每两点之间的颜色序列不同的有多少种 题解:先建出树,对于每个叶子节点,bfs一遍建在sam上,每次保留当前点在sam上的位置,拓展时用父亲节点在sam上的位置当成last即可.然后统计sam本质不同的字符串有多少个 注:dfs 阅读全文
posted @ 2019-04-06 13:44 walfy 阅读(151) 评论(0) 推荐(0) 编辑
摘要:题意:给一个字符串,多组查询,一些后缀两两的lcp长度和,查询个数和不超过1e6 题解:svt就是后缀虚树,suffix virtual tree,考虑后缀树lca求lcp长度,但是查询次数可能很多,不能每次遍历,所以要建出虚数后在虚树上dp,对于一个节点考虑算贡献,对于所有子树,两两算个数乘积乘上 阅读全文
posted @ 2018-11-02 17:25 walfy 阅读(188) 评论(0) 推荐(0) 编辑
摘要:题意:给你多个数字串,求本质不同的子串和(去掉前导零) 题解:建广义sam,刚开始一直想的是用l来计算,发现前导零对l的影响根本消不掉,所以不会做= =,原来应该是直接用一个新的数组表示到当前有多少个子串就好了 // pragma GCC optimize(2) // pragma GCC opti 阅读全文
posted @ 2018-10-18 12:39 walfy 阅读(162) 评论(0) 推荐(0) 编辑
摘要:题意:懒得写背景了,给你一个字符串init,要求你支持两个操作 (1):在当前字符串的后面插入一个字符串 (2):询问字符串s在当前字符串中出现了几次?(作为连续子串) 你必须在线支持这些操作。 题解:可以想到用sam很好维护某个字符串在当前字符串中出现了几次,插入也直接add就好了,但是我们不能每 阅读全文
posted @ 2018-09-30 16:50 walfy 阅读(151) 评论(0) 推荐(0) 编辑
摘要:题意:每次插入一个数字,查询本质不同的子串有多少个 题解:sam,数字很大,ch数组用map来存,每次ins之后查询一下新建点表示多少个本质不同的子串(l[np] l[fa[np]]) / Problem: 4516 User: walfy Language: C++ Result: Accepte 阅读全文
posted @ 2018-09-30 14:01 walfy 阅读(123) 评论(0) 推荐(0) 编辑
摘要:题意:给出n(n define fi first define se second define db double define mp make_pair define pb push_back define pi acos( 1.0) define ll long long define vi 阅读全文
posted @ 2018-08-17 15:54 walfy 阅读(238) 评论(0) 推荐(0) 编辑
摘要:题意:给你一个只有abc的字符串,求不相同的子串,(不同构算不同,例如aba和bab算同构) 题解:很显然,如果不考虑同构的问题,我们直接上sa/sam即可,但是这里不行,我们考虑到只有abc三种字符,枚举所有的映射把6个字符串合在一起求不同子串这样每种子串被算了6次,例如ab (ab,ac,ba, 阅读全文
posted @ 2018-07-21 08:35 walfy 阅读(332) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示