[SCU 4507] 奶牛情书 (AC自动机)
SCU - 4507
求给定长度的文本串,使得每个模式串至少出现过一次
求这样的模式串的个数
AC自动机禁止模式串的裸题
这题求的是一个串至少出现过一次
只要求一次都没出现过的方案总数
再拿所有方案总数相减即可得到答案
然后就拿所有模式串构造 Trie树,然后在上面跑 AC自动机
跑到单词结尾的时候不转移,这样就能求出答案
#pragma comment(linker, "/STACK:102400000,102400000")
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <queue>
using namespace std;
typedef pair<int,int> Pii;
typedef long long LL;
typedef unsigned long long ULL;
typedef double DBL;
typedef long double LDBL;
#define MST(a,b) memset(a,b,sizeof(a))
#define CLR(a) MST(a,0)
#define Sqr(a) (a*a)const int MOD=10007,nxt_siz=26,noden=60*100+10;
struct AC_Auto
{struct node{char chr;int val,fail,nxt[nxt_siz];} *trie;int siz;AC_Auto(int size){siz=0;trie=new node[size];memset(trie,0,sizeof(node)*size);}~AC_Auto(){delete []trie;}int chnum(char x){return x-'A';}void addstr(char*);void init();int solve();
};
int N,M;
int dp[110][noden];int main()
{int T;scanf("%d", &T);for(int ck=1; ck<=T; ck++){AC_Auto ac(noden);scanf("%d%d", &N, &M);for(int i=0; i<N; i++){char patn[110];scanf(" %s", patn);ac.addstr(patn);}ac.init();printf("%d\n", ac.solve());}return 0;
}void AC_Auto::addstr(char *str)
{int len=strlen(str),np=0;for(int i=0; i<len; i++){int ch=chnum(str[i]);if(trie[np].nxt[ch]) np=trie[np].nxt[ch];else{trie[np].nxt[ch]=++siz;np=siz;trie[np].chr=str[i];}if(i==len-1) trie[np].val=1;}
}void AC_Auto::init()
{trie[0].fail = 0;queue<int> que;for(int i=0; i<nxt_siz; i++){int np = trie[0].nxt[i];if(np){que.push(np);trie[np].fail = 0;}}while(!que.empty()){int np = que.front();for(int i=0; i<nxt_siz; i++){int nxp = trie[np].nxt[i];int fap = trie[np].fail;if(!nxp){trie[np].nxt[i] = trie[fap].nxt[i];continue;}que.push(nxp);trie[nxp].fail = trie[fap].nxt[i];fap = trie[nxp].fail;if(trie[fap].val) trie[nxp].val = 1;}que.pop();}
}int AC_Auto::solve()
{CLR(dp);dp[0][0]=1;int res=0,tot=1;for(int i=0; i<M; i++){tot=tot*26%MOD;for(int j=0; j<=siz; j++){if(!dp[i][j]) continue;for(int k=0; k<26; k++){int nxp=trie[j].nxt[k];if(trie[nxp].val) continue;dp[i+1][nxp]=(dp[i+1][nxp]+dp[i][j])%MOD;}}}for(int i=0; i<=siz; i++) res=(res+dp[M][i])%MOD;return ((tot-res)%MOD+MOD)%MOD;
}
[SCU 4507] 奶牛情书 (AC自动机)相关推荐
- Aho-Corasick 多模式匹配算法(AC自动机) 的算法详解及具体实现
多模式匹配 多模式匹配就是有多个模式串P1,P2,P3-,Pm,求出所有这些模式串在连续文本T1-.n中的所有可能出现的位置. 例如:求出模式集合{"nihao","ha ...
- 【BZOJ2434】[NOI2011]阿狸的打字机 AC自动机+DFS序+树状数组
[BZOJ2434][NOI2011]阿狸的打字机 Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P ...
- AC自动机算法及模板
AC自动机算法及模板 2016-05-08 18:58 226人阅读 评论(0) 收藏 举报 分类: AC自动机(1) 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 关于 ...
- Keywords Search AC自动机QAQ
AC自动机,一直以来都以为是一个非常高大上的算法,其实它还真的挺高大上的. 首先来说,ac自动机的思想与kmp类似,需要自己模拟来理解. 给两个博客: http://www.cppblog.com/m ...
- 字符串匹配算法 -- AC自动机 基于Trie树的高效的敏感词过滤算法
文章目录 1. 算法背景 2. AC自动机实现原理 2.1 构建失败指针 2.2 依赖失败指针过滤敏感词 3. 复杂度及完整代码 1. 算法背景 之前介绍过单模式串匹配的高效算法:BM和KMP 以及 ...
- 【Luogu3041】视频游戏的连击(AC自动机,动态规划)
题面链接 题解 首先构建出AC自动机 然后在AC自动机上面跑DP 转移很显然从Trie树的节点跳到他的儿子节点 但是要注意一个问题, 在计算的时候,每一个节点加入后能够 造成的贡献 要加上他的子串的贡 ...
- HDU2896(AC自动机模版题)
AC自动机模版题: 方法一:超时 #include<iostream> #include<algorithm> #include<cstring> #include ...
- HDU2222(AC自动机模版题)
AC自动机是Trie树和KMP的结合物,但是其实KMP在这里体现了思想,而Trie树才是最重要的,要想学懂AC自动机,学习Trie树是必须的,这些是自己在学习AC自动机的个人看法,我也是在网上学习了大 ...
- AC自动机 + 概率dp + 高斯消元 --- HDU 5955 or 2016年沈阳icpc H [AC自动机 + 概率dp + 高斯消元]详解
题目链接 题目大意: 就是有NNN个人,每个人都会猜一个长度为LLL的只包含{1,2,3,4,5,6}\{1,2,3,4,5,6\}{1,2,3,4,5,6}的序列,现在裁判开始投掷骰子,并且把每次的 ...
- P5357 【模板】AC自动机(二次加强版)(AC自动机建fail树dfs求模式串出现次数)
P5357 [模板]AC自动机(二次加强版)(AC自动机建fail树dfs求模式串出现次数) 传送门 形式上,AC 自动机基于由若干模式串构成的 Trie 树,并在此之上增加了一些 fail 边:本质 ...
最新文章
- Python_基础_6
- “用于无监督图像生成解耦的正交雅可比正则化”论文解读
- Greenplum 类型一致性使用规范 - 索引条件、JOIN的类型一致性限制
- Python获取本机所有网卡的MAC地址
- NSArray	数组
- 无损1080i到1080p是如何制作的
- 最新获取展示B站UP主实时信息PHP源码分享
- 水经注全国离线地图都有哪些地图数据?
- 如何下载石家庄市卫星地图高清版大图
- 生物学和计算机学哪个好,生物学和计算机
- base_url 是什么
- c语言hook函数,另类iOS上的C函数hook
- linux查看raw格式磁盘,KVM之raw和qcow2格式虚拟磁盘创建
- Java设计模式之《装饰器模式》及应用场景
- 护眼色的RGB值 和 颜色代码
- Android实现三角形气泡效果方式汇总,高级安卓面试题及答案2019
- 复工“神器”华为云WeLink是怎样炼成的?
- 微信小程序云开发沉浸式(透明)状态栏的实现(怎么写)
- dedecms列表页图片加ALT描述的完美方式
- JavaScript:飘雪效果