![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
AC自动机
Daniel__d
这个作者很懒,什么都没留下…
展开
-
HDU2243-AC自动机+矩阵快速幂
HDU2243 题目描述 长度不超过LLL,只由小写字母组成的,至少包含一个词根的单词,一共可能有多少个呢?这里就不考虑单词是否有实际意义。 题解 先考虑直接dp转移,但是考虑到nnn的大小,显然会T掉。 考虑矩阵乘法,ans=总方案数−不含词根的单词ans=总方案数-不含词根的单词ans=总方案数−不含词根的单词; 首先前半部分是一个幂和的形式: An=261+...+26nSn=An+1=260+261+...+26nSn+1=26Sn+1 A_n=26^1+...+26^n\\ S_n=A_n+1=2原创 2020-08-04 21:15:12 · 204 阅读 · 1 评论 -
POJ2778-AC自动机,矩阵快速幂优化DP
POJ2778 题目描述 简要题意:给出mmm个病毒串,问你由ATGCATGCATGC构成的长度为 nnn 且不包含这些病毒串的字符串有多少个? 题解 定义dp[i][j]=dp[当前长度为i][当前在AC自动机的第j个节点]=方案数dp[i][j]=dp[当前长度为i][当前在AC自动机的第j个节点]=方案数dp[i][j]=dp[当前长度为i][当前在AC自动机的第j个节点]=方案数. 转移方程也十分简单. 但是注意到nnn的大小,显然会T到飞起,考虑矩阵乘法优化,其实再转化一下题意就是:全图中的000原创 2020-07-30 13:47:32 · 174 阅读 · 0 评论 -
HDU4758-AC自动机+状压dp
HDU4758 题目描述 题解 代码 #include<bits/stdc++.h> using namespace std; int f[105][105][305][4],tr[551][2],val[550],cnt,n,m,ans,fail[550],a[2],b[2],t; char s[150]; const int mod=1000000007; void clear(){ cnt=ans=0; memset(tr,0,sizeof(tr)); memset(val,0,si原创 2020-07-26 11:14:11 · 121 阅读 · 0 评论 -
HDU3341-AC自动机+dp
HDU3341 题目描述 题解 代码 #include<bits/stdc++.h>//细节较多 using namespace std; int tr[505][5],val[505],fail[505],has[41][41][41][41],dp[505][15009],n,ans,tot,cnt,num[5],a[5]; char s[50]; void clear(){ tot=cnt=ans=0; memset(tr,0,sizeof(tr)); memset(val,0,原创 2020-07-26 10:57:32 · 134 阅读 · 0 评论 -
HDU2825-AC自动机+状压dp
HDU2825 题目描述 题解 代码 #include<bits/stdc++.h> using namespace std; int dp[28][110][1<<10],tr[110][26],val[110],cnt,n,m,kk,ans,fail[110]; char s[15]; const int mod=20090717; void clear(){ cnt=ans=0; memset(tr,0,sizeof(tr)); memset(val,0,sizeof(v原创 2020-07-26 10:51:33 · 174 阅读 · 0 评论 -
AC自动机板子
#include<bits/stdc++.h>//P3808 #define M 1000007 using namespace std; int trie[M][26],cnt,val[M],last[M],fail[M],n; char s[M]; void build(){ int u=0; int len=strlen(s); for(int i=0;i<len;i++){//建立trie树 int c=s[i]-'a'; if(!trie[u][c]) trie原创 2020-07-22 10:39:33 · 124 阅读 · 0 评论