题目链接 多模式匹配问题,先建 AC 自动机. 套路性的搞个 DP: \(f[i][j]\) 表示前 \(i\) 个字符,当前在 \(AC\) 自动机上的节点是 \(j\) 能匹配到的最多分. 初始化 \(f[0][0] = 0\),其余为负无穷 答案 \(\max\{f[K][i]\}\) 考虑一条边 \(u \Rightarrow v\),加入后缀的贡献,即 \(f[i][v] = \max(f[i - 1][u] + val(v))\) 其中 \(val(v)\) 表示 \(v\) 这个点…
题目链接 题目大意:给定$n$个子串,要求构造一个长度为$m$的母串使得至少有一个子串是其子串.问方案数. ------------------------ 我们可以对要求进行转化:求出不合法的方案数,总方案数减去不合法的方案数即为合法方案数. 首先建一个AC自动机,对于每个串的末尾结点及其$fail$边指向的结点都打上标记,表示遍历AC自动机的时候不经过这些点(因为如果一个串是另一个串的后缀,显然这两个串都是合法的). 然后就可以大力DP了.设$f[i][j]$表示走了$i$步到达$j$结点的…
2021.11.09 P4824 [USACO15FEB]Censoring S与P3121 [USACO15FEB]Censoring G(KMP&&AC自动机) https://www.luogu.com.cn/problem/P4824 题意: 给定字符串S和T,删除S中的T,形成新串,继续删除新串中的T,直至完全删除. 分析: KMP求的是当前S的第i位能匹配到T的第j位,如果j==strlen(T)删除stacki中i-strlen(T)+1~i,继续从S的i+1.k=f[sta…
题目描述 Bessie is playing a video game! In the game, the three letters 'A', 'B', and 'C' are the only valid buttons. Bessie may press the buttons in any order she likes; however, there are only N distinct combos possible (1 <= N <= 20). Combo i is repr…
最近貌似大家都在搞字符串?很长一段时间都没有写博客了……还是补一补坑吧. 感觉AC自动机真的非常优美了,通过在trie树上建立fail指针可以轻松解决多模匹配的问题.实际上在AC自动机上的匹配可以看做是拿着一个串在上面跑,在固定一个左端点的时候尽量地向右匹配.如果发现实在是匹配不下去了,就向右挪动左端点实现新的匹配(跳转fail指针).基本上根据这一条理解,就可以解决大部分的问题了. AC自动机裸考的不多,除了匹配之外一个较常见的搭配就是和DP结合在一起.但本质上依然是在匹配串,只要根据fail…
CF 1400F.x-prime Substrings 题意: 给定一个由\('1'\)到\('9'\)组成的字符串\(s\)和一个数\(x\),定义一个串为\(x-prime\)串,当且仅当这个串上的数字和为\(x\),且任意一个不等于本身的子串的和都不是\(x\)的因子,问最少删多少个数字可以使得串\(s\)的任何子串都不是\(x-prime\)串 \(1 \le |s| \le 1000,1 \le x \le 20\) 题解: 由于\(x\)很小,所以我们可以枚举所有\(x-prime\…
第一道\(AC\)自动机\(+DP.\) 首先,一个自动机上\(DP\)的套路是设\(dp[i][j]\)表示长度为\(i\)匹配到\(j\)节点的最优得分. 那么,由于我们已经建好了\(Trie\)图,我们就应该提前把走到节点\(j\)的所有连击操作处理出来. 有一条显然结论:如果在\(fail\)树上经过了这个串结尾节点中子树中的任意一点,则这次匹配一定会包含这个串. 换句话说,我们在对每一个节点更新\(fail\)的时候,其分值应该直接把其\(fail\)的分值加上. 于是我们进行\(dp…
这个套路挺有意思的. 把 $trie$ 和 $fail$ 树都建出来,然后一起跑一跑就好了~ #include <queue> #include <cstdio> #include <vector> #include <cstring> #include <algorithm> #define N 500004 #define setIO(s) freopen(s".in","r",stdin) using…
题目描述 Farmer John has purchased a subscription to Good Hooveskeeping magazine for his cows, so they have plenty of material to read while waiting around in the barn during milking sessions. Unfortunately, the latest issue contains a rather inappropria…
传送门 默认大家都学过trie与AC自动机. 先求出fail,对于每个节点维护一个sum,sum[u]待表从根到u所形成的字符串能拿到几分.显然sum[u]=sum[fail] + (u是几个字符串的结尾). 设dp[i][j]代表长度为i到trie树上的j号节点所得的最大分数,显然有dp[i+1][j的字符k儿子] = max{dp[i+1][j的字符k儿子], dp[i][j] + sum[j的字符k儿子]} memset(dp, -, sizeof(dp)); dp[][] = ; ; i…