bzoj 1030 ac自动机
比较容易看出来先建立ac自动机,然后在自动机上做DP,设w[0..1][i][j]为当前不包括/包括字典中的字符串,当前在自动机中走到第i个节点,完成的文本的长度为j的方案数,那么比较容易的转移w[i|j->child->cnt][j->child][k+1]+=w[i][j][k]。
/**************************************************************
Problem: 1030
User: BLADEVIL
Language: C++
Result: Accepted
Time:200 ms
Memory:25596 kb
****************************************************************/
//By BLADEVIL
#include <cstdio>
#include <cstring>
#define maxn 10010
#define maxm 200
#define d39 10007
using namespace std;
int n,m;
int w[][maxm][maxn];
struct node{
int cnt,num;
node *child[],*fail;
node (){
cnt=num=;
memset(child,,sizeof child);
fail=NULL;
}
} nodepool[maxn],*totnode,*root,*que[maxn];
void build_trie(){
totnode=nodepool; root=totnode++;
for (int i=;i<=n;i++){
char c[maxm];
scanf("%s",&c);
int len=strlen(c);
node *t=root;
for (int j=;j<len;j++){
if (!t->child[c[j]-'A']) t->child[c[j]-'A']=totnode++;
t=t->child[c[j]-'A'];
}
t->cnt=;
}
}
void build_ac(){
int h=,t=;
que[]=root; root->fail=root;
for (int i=;i<;i++) if (!root->child[i]) root->child[i]=root;
while (h<t){
node *u=que[++h];
for (int i=;i<;i++) if (u->child[i]&&u->child[i]!=root){
que[++t]=u->child[i];
que[t]->fail=u->fail->child[i]!=que[t]?u->fail->child[i]:root;
que[t]->cnt|=que[t]->fail->cnt;
} else u->child[i]=u->fail->child[i];
}
}
void dp(){
int j=;
for (node *i=nodepool;i!=totnode;i++) i->num=j++;
//for (node *i=nodepool;i!=totnode;i++) printf("%d %d %d\n",i->cnt,i->num,i->fail->num);
w[][][]=;
for (int t=;t<;t++)
for (int i=;i<=m;i++)
for (node *j=nodepool;j!=totnode;j++)
if (w[t][i][j->num])
for (int k=;k<;k++)
(w[t|j->child[k]->cnt][i+][j->child[k]->num]+=w[t][i][j->num])%=d39;
int ans=;
for (node *i=nodepool;i!=totnode;i++)
(ans+=w[][m+][i->num])%=d39;
printf("%d\n",ans);
}
int main(){
scanf("%d%d",&n,&m);
build_trie();
build_ac();
dp();
return ;
}
bzoj 1030 ac自动机的更多相关文章
- bzoj 1030 AC自动机+dp
代码: //先把给的单词建AC自动机并且转移fail,然后d[i][j]表示构造的文章到第i位时处在字典树的第j个节点的不包含单词的数量,最后用总的数量26^m //-d[m][0~sz]即可.其中不 ...
- bzoj 3172 AC自动机
初学AC自动机,要先对于每一个模式串求出来trie树,在此基础上构建fail指针,然后在trie树加上失配边构建出整张trie图. AC自动机的原理和KMP差不多,一个节点的fail指针就是指向tri ...
- 【无聊放个模板系列】BZOJ 3172 (AC自动机)
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #inc ...
- bzoj 2434 AC自动机+树状数组
2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 3493 Solved: 1909[Submit][Sta ...
- bzoj 2434 ac自动机
ac自动机中,如果以trie中的节点为节点,(fail[i],i)为边,可以建立一颗树,该树有如下特点:“节点u是节点v的祖先 当且仅当 u代表的字符串是v代表的字符串的一个后缀”.(u代表的字符串是 ...
- bzoj 2754 ac自动机
第一道AC自动机题目. 记一下对AC自动机的理解吧: AC自动机=Trie+KMP.即在Trie上应用KMP思想,实现多Pattern的匹配问题. 复杂度是预处理O(segma len(P)),匹配是 ...
- bzoj 2434 AC自动机 + fail指针建树 + 树状数组
思路:我们先跟着它给定的字符串走把字典树建出来,求出fail指针,我们考虑两个字符串 A和B, 如果想要求B中有多少A的子串,转换一下就是有多少个B的前缀的后缀包含A,这个在AC自动机 的状态图中很容 ...
- bzoj 1444 AC自动机 + 矩阵乘法 | 高斯消元
恶补了一下AC自动机,花了一天时间终于全部搞明白了. 思路:将每个人的串加入AC自动机,在AC自动机生成的状态图上建边,注意单词末尾的节点只能转移到自己概率为1, 然后将矩阵自乘几十次后误差就很小了, ...
- BZOJ 3940 AC自动机
思路: 需要维护一个栈的AC自动机--. 要求出来 最后的栈顶是在自动机上的哪个节点. if(!ac.ch[st[tp-1]][a[i]-'a']) st[tp]=ac.ch[ac.f[st[tp-1 ...
随机推荐
- <Effective C++>读书摘要--Inheritance and Object-Oriented Design<一>
1.Furthermore, I explain what the different features in C++ really mean — what you are really expres ...
- linux下清空文件全部内容,如log日志
在实际操作中经常需要清空log文件, 比如a.log, 有的人说, 直接删除不就行了, 但是, 直接删除后, 没法使用tail -f a.log了. 有的人说, 先rm再touch一个新文件不就可 ...
- VS升级后的配置问题
当vs升级到更新的版本后,运行原来无误的程序会出现一系列问题. 例如:打不开iostream文件,lib文件,系统找不到文件等等 出现这类问题的原因是,编译环境的include path和librar ...
- MyBatis原理系列
原理分析之一:从JDBC到Mybatis 原理分析之二:框架整体设计 原理分析之三:初始化(配置文件读取和解析) 原理分析之四:一次SQL查询的源码分析
- 【WCF】WCF 附录 高级主题 配置服务配额设置
微软产品自带一个“默认安全”方案.这也包括了WCF,意味着WCF中的多种配置可以设置来阻止诸如DOS(拒绝服务访问)攻击.微软为很多基于一个单一计算机的开发环境选择这样的设置.这也意味着默认设置中的一 ...
- Spring Boot 最简单的HelloWorld
创建一个Spring Boot,可以直接使用构建工具(Maven或Gradle)创建,也可以使用spring.io网站创建,一般会选择使用spring.io创建 使用IDEA创建一个Spring Bo ...
- 【bzoj1596】[Usaco2008 Jan]电话网络 树形dp
题目描述 Farmer John决定为他的所有奶牛都配备手机,以此鼓励她们互相交流.不过,为此FJ必须在奶牛们居住的N(1 <= N <= 10,000)块草地中选一些建上无线电通讯塔,来 ...
- 【bzoj2100】[Usaco2010 Dec]Apple Delivery 最短路
题目描述 Bessie has two crisp red apples to deliver to two of her friends in the herd. Of course, she tr ...
- CentOS 文件隐藏属性
1.chattr用于配置文件的隐藏属性 语法: chattr [-RVf] [-+=aAcCdDeijsStTu] [-v version] files... 选项与参数: +:增加某个特殊参数,其他 ...
- 【题解】Atcoder ARC#90 F-Number of Digits
Atcoder刷不动的每日一题... 首先注意到一个事实:随着 \(l, r\) 的增大,\(f(r) - f(l)\) 会越来越小.考虑暴力处理出小数据的情况,我们可以发现对于左端点 \(f(l) ...