
ac自动机
hannibal_lecter_
这个作者很懒,什么都没留下…
展开
-
【模板】ac自动机
#pragma GCC optimize(2)#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn = 1e6+5;int n, cnt[200];char temp[200][100];struct node{ int nex[maxn][26], val[m...原创 2019-02-03 09:57:57 · 104 阅读 · 0 评论 -
Clannad 18四川省赛【AC自动机+DP】
题目链接第一次遇到卡last优化的题。因为要不断跳fail链上的ed节点,不用last优化的话会T。因为fail指针指向的是当前节点的最长后缀,所以用dp[i]表示前i个字符能分解的数量,转移方程就为dp[i] += dp[i-size[u]] (u是fail链上的所有节点)所以要last优化。。。#include<bits/stdc++.h>using namespac...原创 2019-04-09 09:10:27 · 260 阅读 · 0 评论 -
HDU-2825[AC自动机+状压dp]
不要被状压吓倒了。。和之前用AC自动机求构造字符串的数量方法类似,但是这个问题要多开一维状态表示包含多少特殊的串。dp[i][j][k]表示长度为i已经匹配到j的串包含特殊串的状态为k的数量。转移方程是dp[i][u][s|ed[u]] += dp[i-1][j][s](u = j->ch)#include<bits/stdc++.h>using namespace st...原创 2019-04-09 00:36:12 · 128 阅读 · 0 评论 -
ZOJ - 3494【AC自动机+数位DP】
数据那么大肯定是数位DP呀。DP状态很好分析出来,注意数位DP上判一下前导零的情况就行。#include<bits/stdc++.h>using namespace std;const int maxn = 2005;typedef long long ll;char ss[maxn];int bit[maxn];ll dp[205][maxn];const ll m...原创 2019-04-11 14:30:26 · 148 阅读 · 0 评论 -
poj-2778 DNA Sequence[AC自动机+矩阵快速幂]
题目地址因为n很大,很自然想到用矩阵快速幂。首先要知道对于一个01矩阵,如果m[i, j] = 1,表示从i到j有一条路,那么这个矩阵在自乘n次后,m[i,j]表示从i->j走n步的的方案数(离散书上的图论相关内容)所以只需要找到哪些边是可以走的,然后跑一下矩阵快速幂就行了。先把病毒放到ac自动机里面,对于结尾的节点标记一下,然后把可以走的边放到矩阵里面跑一下矩阵快速幂就行了。#i...原创 2019-04-07 20:34:54 · 116 阅读 · 0 评论 -
poj-1625 Censored![ac自动机+dp+高精度]
题目地址先把病毒串丢进ac自动机里面。dp[i][j]表示长度为i的从trie图的根节点到j满足条件的串的数量。因为答案很大,要用到高精度。注意的是建图的时候,ed[u] |= ed[f[u]],如果失配指针的位置是病毒的话那么u也不能匹配。#include<cstdio>#include<cstring>#include<algorithm>#...原创 2019-04-07 13:44:48 · 241 阅读 · 0 评论 -
HDU-2243考研路茫茫——单词情结【AC自动机+矩阵快速幂】
看到L那么大就应该想到矩阵快速幂。而且这道题和之前的POJ 2778. DNA Sequence很想。我们只需要计算一下长度小于等于n的不包含特殊串的个数(矩阵中要增加一维代表每一行的sum),然后用总的可能数减去不包含的就是答案了(总的可能数很多人都是用矩阵写的,其实用等比数列求和公式就行了啊)。#include<bits/stdc++.h>using namespace s...原创 2019-04-11 08:09:17 · 228 阅读 · 2 评论 -
HDU-2457 DNA repair【AC自动机+DP】
第一次。。自己分析出来的dp。。。。。和之前做过的题很像,感觉有关构造字符串的题都有套路。dp中一定包含一维trie图中的节点状态(好像是废话)这道题我们用dp[i][j]表示长度为i节点状态为j最少消去的数量。状态转移就是dp[i][u] = min(dp[i][u], dp[i-1][j]+(ch!=ss[i]));#include<bits/stdc++.h>usin...原创 2019-04-10 22:51:14 · 209 阅读 · 0 评论 -
bzoj-2434阿狸的打字机[AC自动机+fail树+dfs序+树状数组]
前置知识: ac自动机 fail树关键在于fail树的应用:子节点的后缀一定包含父节点。对于x在y中出现了多少次。先假设y至少包含一个x。那么在trie图中从根节点到y的那条链中一定存在某个节点的后缀是x。所以找到这样的节点就能知道包含x的数量。处理:我们可以按照打字的顺序建图,记录一下tire图中的pre,当操作’B’的时候就跳到pre[u],对于’P’的操作记录一下时间戳...原创 2019-04-06 21:08:05 · 142 阅读 · 0 评论 -
bzoj-3172单词[fail树]
fail树的性质:子节点是以父节点为后缀的串。对于这道题,我们用num[]维护每个串出现的次数,在insert的时候对每个节点都要加一,表示这个节点已经出现过一次了。最后我们构建fail树,然后把每个子节点的num都加到当前节点上就是这个串总共出现的次数了。#include<bits/stdc++.h>using namespace std;const int maxn = ...原创 2019-04-06 20:15:46 · 135 阅读 · 0 评论 -
SPOJ - WPUZZLES[AC自动机]
首先把所有拼图丢到自动机里面。然后从边界位置枚举各种可能的方向。ac自动机的询问就可以判断一下当前节点是否是结尾然后记录答案。#include<bits/stdc++.h>using namespace std;const int maxn = 1e3+5;char maze[maxn][maxn];int len[maxn];struct node{ int x,...原创 2019-04-06 12:57:05 · 132 阅读 · 0 评论 -
zoj3441 Searching the String
对于可以覆盖的串,我们直接上模板。对于不能覆盖的串,我们可以记录字典树中当前节点在询问串中的上一次询问的位置。然后对于不能覆盖的询问,用当前串的位置减去上一次询问字典树中当前节点的位置和当前深度比较一下就行了。#include<bits/stdc++.h>using namespace std;const int maxn = 6e5+5;int res[maxn][2];...原创 2019-04-06 09:48:29 · 106 阅读 · 0 评论 -
【ac自动机】【DP】
fold爷出的题,突然想起来了存个板子。。对串S讨论一下DP就行了dp[i][u]=max(dp[i−1][j]+val[u],dp[i][u])dp[i][u] = max(dp[i-1][j]+val[u], dp[i][u]) dp[i][u]=max(dp[i−1][j]+val[u],dp[i][u])注意建fail指针的时候要val[u] += val[fail[u]],一个t串...原创 2019-07-31 11:05:55 · 186 阅读 · 0 评论