
后缀自动机
gigo_64
莫看,莫看,这不是真实的我(七海脸)
溜了溜了
展开
-
【TJOI2017】DNA【后缀自动机】
传送门稍显窒息的是:这道题只有ATCG四种字符,高中生物知识,,,,,,后缀自动机的优秀之处在于我从跟节点开始走可以走出所有的子串。所以直接dfs记录一下有没有超出3个就好了。#include<bits/stdc++.h>using namespace std;struct node{ int ch[6],fail,len,key;}t[200003];int ...原创 2019-10-18 11:25:56 · 131 阅读 · 0 评论 -
【HAOI2016】找相同字符【后缀自动机】
传送门后缀自动机总结这种需要匹配的问题都是将一个串建成自动机,别的串上去跑。在跑的时候叠加答案,我们发现如果找上了一个结点,那这个结点的所有fail,作为这个子串的后缀,都应该被匹配。所以答案应该从fail链上累加下来。而每个点代表一个串集合。串的个数是maxlen-minlen+1。而minlen=fail的maxlen+1。所以直接减去fail的maxlen就能得到本点代表的字符串...原创 2019-10-16 09:07:28 · 112 阅读 · 0 评论 -
【SPOJ8222】Substrings【后缀自动机】
万能VJudge后缀自动机总结求每种长度的子串最大数量。fail树上加起来即可。注意:初始size只能打在字符结点上,不能打在复制结点上。这违背了size的本意。#include<bits/stdc++.h>using namespace std;#define int long longchar ch[250003];struct node{ in...原创 2019-10-16 08:15:18 · 113 阅读 · 0 评论 -
【SDOI2016】生成魔咒【后缀自动机】
传送门后缀自动机总结后方加点,问本质不同子串数量。每新加一个点,当前点的maxlen减去fail的maxlen就是多出来的子串数量。如此便可以维护。不过字符集太大,可以使用map来装儿子。#include<bits/stdc++.h>using namespace std;#define in read()#define int long longint ...原创 2019-10-16 07:43:00 · 108 阅读 · 0 评论 -
【AHOI2013】差异【后缀自动机】
后缀自动机总结传送门求任意两个后缀长度减去其公共前缀长度。如果把串反过来,就是任意两个前缀长度减去其公共后缀长度。公共后缀直接fail树上lca即可。而字符串前缀只有原串长度len个。根据公式,如果将问题转化为两点路径长度和,那边权赋为子节点长减去fail节点长。这样问题就得以转化。而一条边的贡献就是其两端size的乘积。如此可以计算。#include<...原创 2019-10-15 07:57:21 · 138 阅读 · 0 评论 -
【TJOI2015】弦论【后缀自动机】
后缀自动机总结传送门分两个子问题。如果只算一次,那直接dag上动规就行。如果多算,就在插入的时候打个endsize=1。我是在准备的时候弄得。先fail树上endsize累加起来。注意1的endsize不能要。然后再dag上动规。不用建出这些树,因为长度大的一定在底层,所以从大到小处理即可。记得搜索的时候减去自己这个串的贡献。#include<bits/stdc++...原创 2019-10-14 22:06:59 · 129 阅读 · 0 评论 -
【洛咕3804】后缀自动机模板
后缀自动机总结传送门板子,fail树上dfs// luogu-judger-enable-o2#include<bits/stdc++.h>using namespace std;#define in read()#define int long longint in{ int cnt=0,f=1;char ch=0; while(!isdigit(ch))...原创 2019-10-14 21:13:05 · 110 阅读 · 0 评论 -
后缀自动机【TAT】
题目来源由于之前我懒没写博客以至于花了大量时间来复健。从后缀自动机起点开始,走出来的任何串都是原串后缀。从任何一个节点开始,走出来的串合起来就是所有子串。一个后缀自动机上的结点指其endpos集合相同的一坨字符串。体现在从起点走到该点的所有串集合上。我们假设一个变量maxlen为该集合的最长子串长度。我直接说建造过程,就不管看不看得懂了。首先,新建点u继承上一个点的信息,...原创 2019-10-14 20:29:17 · 196 阅读 · 0 评论