1030: [JSOI2007]文本生成器
1030: [JSOI2007]文本生成器
https://www.lydsy.com/JudgeOnline/problem.php?id=1030
分析:
AC自动机+dp。
正难则反,求满足的,可以求出不满足的,用总的减去。所以考虑如何就出所有的长度为m的串里,没有出现任何一个单词的个数。
建立AC自动机,然后会有一些点是一定不能走的,这些点要么是某些单词的结尾,或者是包含了某些单词(以它结尾的串的后缀是一个单词)。
然后f[i][j]表示当前有i位,在AC自动机的第j个位置的方案数,即文本串中的后缀是AC自动机从0到这里构成的串,那么只要让文本串不要走有标记的点就行了。枚举下一位是什么,在AC自动机上转移。(注意,可能有许多点有些字符没有边,那么经过了这个字符也是合法的。这些的点贡献也要算上。假设存在这个点,直接转移即可。重新走到0号点的意义是当前和文本串的匹配长度为0)
代码:
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #include<cmath> 5 #include<iostream> 6 #include<cctype> 7 #include<set> 8 #include<vector> 9 #include<queue> 10 #include<map> 11 #define fi(s) freopen(s,"r",stdin); 12 #define fo(s) freopen(s,"w",stdout); 13 using namespace std; 14 typedef long long LL; 15 16 inline int read() { 17 int x=0,f=1;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1; 18 for(;isdigit(ch);ch=getchar())x=x*10+ch-'0';return x*f; 19 } 20 21 const int N = 105; 22 const int C = 200005; 23 const int mod = 10007; 24 25 char s[N]; 26 int f[N][C], ch[C][26], val[C], fail[C], q[C], Index, n, m; 27 28 void Insert(char *s) { 29 int u = 0, len = strlen(s + 1); 30 for (int i=1; i<=len; ++i) { 31 int c = s[i] - 'A'; 32 if (!ch[u][c]) ch[u][c] = ++Index; 33 u = ch[u][c]; 34 } 35 val[u] = 1; 36 } 37 void build() { 38 int L = 1, R = 0; fail[0] = 0; 39 for (int c=0; c<26; ++c) { 40 int u = ch[0][c]; 41 if (u) fail[u] = 0, q[++R] = u; 42 } 43 while (L <= R) { 44 int u = q[L ++]; 45 for (int c=0; c<26; ++c) { 46 int v = ch[u][c]; 47 if (!v) { 48 ch[u][c] = ch[fail[u]][c]; continue; // !!! 49 } 50 q[++R] = v; 51 int p = fail[u]; 52 while (p && !ch[p][c]) p = fail[p]; 53 fail[v] = ch[p][c]; 54 val[v] = val[v] ? val[v] : val[fail[v]]; 55 } 56 } 57 } 58 void dp() { 59 f[0][0] = 1; 60 for (int i=0; i<m; ++i) { 61 for (int j=0; j<=Index; ++j) { 62 if (val[j] || !f[i][j]) continue; 63 for (int c=0; c<26; ++c) { // 不仅要走存在的,也要走不存在的点,存在的点不能走有标记的。 64 (f[i + 1][ch[j][c]] += f[i][j]) %= mod; 65 } 66 } 67 } 68 } 69 int main() { 70 n = read(), m = read(); 71 for (int i=1; i<=n; ++i) { 72 scanf("%s", s + 1); 73 Insert(s); 74 } 75 build(); 76 dp(); 77 int ans = 1; 78 for (int i=1; i<=m; ++i) ans = (ans * 26) % mod; 79 for (int j=0; j<=Index; ++j) 80 if (!val[j]) ans = (ans - f[m][j] + mod) % mod; 81 cout << ans; 82 return 0; 83 }
转载于:https://www.cnblogs.com/mjtcn/p/9726314.html
1030: [JSOI2007]文本生成器相关推荐
- BZOJ 1030: [JSOI2007]文本生成器 [AC自动机 DP]
1030: [JSOI2007]文本生成器 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 3953 Solved: 1614 [Submit][St ...
- bzoj 1030: [JSOI2007]文本生成器(AC自动机+DP)
1030: [JSOI2007]文本生成器 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 5187 Solved: 2136 [Submit][St ...
- 1030: [JSOI2007]文本生成器 ac自动机+dp
https://www.lydsy.com/JudgeOnline/problem.php?id=1030 求长度为m不包含n个子串的种数, 跑完ac自动机之后没办法跑矩阵快速幂,因为状态数比较大(6 ...
- [BZOJ1030] [JSOI2007]文本生成器
1030: [JSOI2007]文本生成器 Time Limit: 1 Sec Memory Limit: 162 MB Description JSOI交给队员ZYX一个任务,编制一个称之为&qu ...
- [BZOJ1030][JSOI2007]文本生成器
1030: [JSOI2007]文本生成器 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 5025 Solved: 2080 [Submit][St ...
- BZOJ1030: [JSOI2007]文本生成器
Description JSOI交给队员ZYX一个任务,编制一个称之为"文本生成器"的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生 ...
- [BZOJ1030]:[JSOI2007]文本生成器(AC自动机+DP)
题目传送门 题目描述: JSOI交给队员ZYX一个任务,编制一个称之为"文本生成器"的电脑软件:该软件的使用者是一些低幼人群, 他们现在使用的是GW文本生成器v6版.该软件可以随机 ...
- [JSOI2007]文本生成器
Time Limit: 1 Sec Memory Limit: 162 MB Submit: 4962 Solved: 2055 [Submit][Status][Discuss] Descrip ...
- [BZOJ1030] [JSOI2007] 文本生成器 (AC自动机 dp)
Description JSOI交给队员ZYX一个任务,编制一个称之为"文本生成器"的电脑软件:该软件的使用者是一些低幼人群, 他们现在使用的是GW文本生成器v6版.该软件可以随机 ...
- bzoj1030 [JSOI2007] 文本生成器(ACAM+dp)
求长度为m的,至少包含一个模式串的文本串个数. 我们考虑用所有的个数26m26^m减去一个模式串也不包含的个数. 后者我们可以建出ACAM,然后在ACAM上跑dp即可. #include <cs ...
最新文章
- 2019年终总结:好好爱自己
- memcpy 头文件_C|memcpy()和memmove()的比较及实现
- java 路径的故事
- SQL Server【二】单表查询
- ORA-01858: 在要求输入数字处找到非数字字符 13行
- undefined reference to `kbhit'
- [转载]高性能托管应用程序设计入门
- 电脑画画软件_数码印花设计与电脑手绘
- 安徽省级办公室高级应用计算机二级,2019年9月安徽省计算机等级二级考试教程:二级MSOffice高级应用上机指导...
- 12个C语言必背实例
- 《大白AI周报》精华内容整理汇总
- TouchDesigner处理串口数据
- 项目管理如何真正实现降本增效?
- 无法忘却的旋律:《荷东》、《猛士》各专辑的曲目列表
- 利用shell脚本解决区块链Fabric学习时下载Docker镜像失败和费时问题
- Linux ar命令(更改静态库相关属性信息)
- 昆仑万维:如涵在纳斯达克挂牌 公司持有其3.91%股权
- 我的世界java免费云电脑,云电脑app下载_云电脑官方版下载-我的世界中文网
- `Computer-Algorithm` 最小生成树MST,Prim,Kruskal,次小生成树
- 老款诺基亚6 android 8,行动迅速!诺基亚为Nokia 6/7推送安卓8.0
热门文章
- 服务器芯片组 硒武,不到两个月的服务器,武器炼化出这属性是什么水平?
- php mysql pod_php – 连接到同一pod中的MySQL容器
- django settings 定义的变量不存在_【Django】第一期|初识Django以及基本安装方法和配置...
- C++ 使用其它文件的类
- camera主观测试_镜头测试:日本富士EBC 135/2.5+索尼A7微单实拍北京北海公园
- Redis学习(1)NoSQL非关系型数据库、Redis概述、Linux安装Redis
- mysql 字符串搜_Mysql搜索字符串
- shell如何清除linux系统所有任务,技术|RHCE 系列(四): 使用 Shell 脚本自动化 Linux 系统维护任务...
- 金蝶专业版过账提示运行时错误5_金蝶财务软件的操作流程
- 阶段3 2.Spring_10.Spring中事务控制_7 spring基于注解的声明式事务控制