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]文本生成器相关推荐

  1. BZOJ 1030: [JSOI2007]文本生成器 [AC自动机 DP]

    1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 3953  Solved: 1614 [Submit][St ...

  2. bzoj 1030: [JSOI2007]文本生成器(AC自动机+DP)

    1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 5187  Solved: 2136 [Submit][St ...

  3. 1030: [JSOI2007]文本生成器 ac自动机+dp

    https://www.lydsy.com/JudgeOnline/problem.php?id=1030 求长度为m不包含n个子串的种数, 跑完ac自动机之后没办法跑矩阵快速幂,因为状态数比较大(6 ...

  4. [BZOJ1030] [JSOI2007]文本生成器

    1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MB Description JSOI交给队员ZYX一个任务,编制一个称之为&qu ...

  5. [BZOJ1030][JSOI2007]文本生成器

    1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 5025  Solved: 2080 [Submit][St ...

  6. BZOJ1030: [JSOI2007]文本生成器

    Description JSOI交给队员ZYX一个任务,编制一个称之为"文本生成器"的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生 ...

  7. [BZOJ1030]:[JSOI2007]文本生成器(AC自动机+DP)

    题目传送门 题目描述: JSOI交给队员ZYX一个任务,编制一个称之为"文本生成器"的电脑软件:该软件的使用者是一些低幼人群, 他们现在使用的是GW文本生成器v6版.该软件可以随机 ...

  8. [JSOI2007]文本生成器

    Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 4962  Solved: 2055 [Submit][Status][Discuss] Descrip ...

  9. [BZOJ1030] [JSOI2007] 文本生成器 (AC自动机 dp)

    Description JSOI交给队员ZYX一个任务,编制一个称之为"文本生成器"的电脑软件:该软件的使用者是一些低幼人群, 他们现在使用的是GW文本生成器v6版.该软件可以随机 ...

  10. bzoj1030 [JSOI2007] 文本生成器(ACAM+dp)

    求长度为m的,至少包含一个模式串的文本串个数. 我们考虑用所有的个数26m26^m减去一个模式串也不包含的个数. 后者我们可以建出ACAM,然后在ACAM上跑dp即可. #include <cs ...

最新文章

  1. 2019年终总结:好好爱自己
  2. memcpy 头文件_C|memcpy()和memmove()的比较及实现
  3. java 路径的故事
  4. SQL Server【二】单表查询
  5. ORA-01858: 在要求输入数字处找到非数字字符 13行
  6. undefined reference to `kbhit'
  7. [转载]高性能托管应用程序设计入门
  8. 电脑画画软件_数码印花设计与电脑手绘
  9. 安徽省级办公室高级应用计算机二级,2019年9月安徽省计算机等级二级考试教程:二级MSOffice高级应用上机指导...
  10. 12个C语言必背实例
  11. 《大白AI周报》精华内容整理汇总
  12. TouchDesigner处理串口数据
  13. 项目管理如何真正实现降本增效?
  14. 无法忘却的旋律:《荷东》、《猛士》各专辑的曲目列表
  15. 利用shell脚本解决区块链Fabric学习时下载Docker镜像失败和费时问题
  16. Linux ar命令(更改静态库相关属性信息)
  17. 昆仑万维:如涵在纳斯达克挂牌 公司持有其3.91%股权
  18. 我的世界java免费云电脑,云电脑app下载_云电脑官方版下载-我的世界中文网
  19. `Computer-Algorithm` 最小生成树MST,Prim,Kruskal,次小生成树
  20. 老款诺基亚6 android 8,行动迅速!诺基亚为Nokia 6/7推送安卓8.0

热门文章

  1. 服务器芯片组 硒武,不到两个月的服务器,武器炼化出这属性是什么水平?
  2. php mysql pod_php – 连接到同一pod中的MySQL容器
  3. django settings 定义的变量不存在_【Django】第一期|初识Django以及基本安装方法和配置...
  4. C++ 使用其它文件的类
  5. camera主观测试_镜头测试:日本富士EBC 135/2.5+索尼A7微单实拍北京北海公园
  6. Redis学习(1)NoSQL非关系型数据库、Redis概述、Linux安装Redis
  7. mysql 字符串搜_Mysql搜索字符串
  8. shell如何清除linux系统所有任务,技术|RHCE 系列(四): 使用 Shell 脚本自动化 Linux 系统维护任务...
  9. 金蝶专业版过账提示运行时错误5_金蝶财务软件的操作流程
  10. 阶段3 2.Spring_10.Spring中事务控制_7 spring基于注解的声明式事务控制