给你若干给字符串,再给你一个m,问长度是m的字符串中包含给定字符串的数量mod 10007是多少

这个拿过来啥思路也没有,后来还是看了题解,才知道,原来,原来。。。。那个带fail的Trie还可以搞别的

网上的大多数都是26^m-补集做的,麻烦啊,网上有一个非洲猴的blog写的挺好的

设f[i][j][k]表示什么呢,表示i:0..1 j:0..m k:0...size

表示i状态,匹配到j,在Trie上是k的数量

f[i | val[next[c]]][j + 1][next[c]] += f[i][j][k];对就是这样

我已经把next[c] == NULL的都变成fail了,

提醒按照lrj的白书学的AC自动机的同学们,那个last数组在匹配的所有时候都要循环枚举

提醒我自己当k等于0是不是这个位置是无,而是一个未匹配的点,因为计算last和dp时用last耗时代码量费啊

  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #include <queue>
  5. #include <algorithm>
  6. using namespace std;
  7. struct AC{
  8. int ch[100010][30];
  9. int val[100010];
  10. char s[100010];
  11. int f[100010];
  12. int last[100010];
  13. int g[2][200][10010];
  14. int size;
  15. int len;
  16. inline int num(char x){
  17. return x - 'A';
  18. }
  19. inline void init(){
  20. memset(ch, 0, sizeof(ch));
  21. memset(val, 0, sizeof(val));
  22. size = 0;
  23. return;
  24. }
  25. inline void insert(){
  26. int u = 0;
  27. for(int i = 0; i < len; i ++){
  28. int c = num(s[i]);
  29. if(!ch[u][c]){
  30. ch[u][c] = ++ size;
  31. }
  32. u = ch[u][c];
  33. }
  34. val[u] = 1;
  35. return;
  36. }
  37. inline void getfail(){
  38. queue<int> Q;
  39. for(int i = 0; i < 26; i ++) {
  40. if(ch[0][i]) {
  41. Q.push(ch[0][i]);
  42. }
  43. }
  44. while(!Q.empty()){
  45. int r = Q.front(); Q.pop();
  46. for(int i = 0; i < 26; i ++){
  47. int u = ch[r][i];
  48. if(!u){
  49. ch[r][i] = ch[f[r]][i];
  50. continue;
  51. }
  52. Q.push(u);
  53. int v = f[r];
  54. while(v && !ch[v][i]) v = f[v];
  55. f[u] = ch[v][i];
  56. }
  57. }
  58. return;
  59. }
  60. inline int dp(int m){
  61. for(int i = 0; i <= size; i ++){
  62. if(!val[i]){
  63. int j = f[i];
  64. while(j){
  65. if(val[j] == 1){
  66. val[i] = 1;
  67. break;
  68. }
  69. j = f[j];
  70. }
  71. }
  72. }
  73. g[0][0][0] = 1;
  74. for(int i = 0; i <= 1; i ++){
  75. for(int j = 0; j < m; j ++){
  76. for(int k = 0; k <= size; k ++){
  77. for(int c = 0; c < 26; c ++){
  78. g[i | val[ch[k][c]]][j + 1][ch[k][c]] += g[i][j][k];
  79. g[i | val[ch[k][c]]][j + 1][ch[k][c]] %= 10007;
  80. }
  81. }
  82. }
  83. }
  84. int ret = 0;
  85. for(int k = 0; k <= size; k ++) {
  86. ret += g[1][m][k];
  87. ret %= 10007;
  88. }
  89. return ret;
  90. }
  91. } wt;
  92. int main(){
  93. int N, M;
  94. scanf("%d%d", &N, &M);
  95. wt.init();
  96. for(int i = 1; i <= N; i ++){
  97. scanf("%s", wt.s);
  98. wt.len = strlen(wt.s);
  99. //if(wt.len > M) continue;
  100. wt.insert();
  101. }
  102. wt.getfail();
  103. printf("%d\n", wt.dp(M));
  104. return 0;
  105. }

BZOJ1030——文本生成器的更多相关文章

  1. bzoj1030 文本生成器(AC自动机+dp)

    1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 4777  Solved: 1986[Submit][Stat ...

  2. bzoj1030 文本生成器

    题目链接 题意 给出\(n\)个字符串,要构造一个长度为\(m\)的字符串\(S\),使得给出的\(n\)个字符串中至少有一个是\(S\)的子串.问方案数. 思路 \(AC\)自动机+\(DP\) 考 ...

  3. 【BZOJ1030】文本生成器(AC自动机,动态规划)

    [BZOJ1030]文本生成器(AC自动机,动态规划) 题面 BZOJ 题解 超级简单良心送分题 很明显是所有状态-不合法状态 合法状态就是\(26^m\) 不合法状态做一个\(dp\)就好 #inc ...

  4. 【BZOJ1030】[JSOI2007]文本生成器 AC自动机+动态规划

    [BZOJ1030][JSOI2007]文本生成器 Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文 ...

  5. BZOJ1030 JSOI2007 文本生成器 【AC自动机】【DP】*

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

  6. 【bzoj1030】: [JSOI2007]文本生成器 字符串-AC自动机-DP

    [bzoj1030]: [JSOI2007]文本生成器 首先把匹配任意一个的个数的问题转化为总个数-没有一个匹配的个数 先构造AC自动机,然后枚举每一位的字母以及在自动机上的位置 f[i][j]为第i ...

  7. 【BZOJ-1030】文本生成器 AC自动机 + DP

    1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3253  Solved: 1330[Submit][Stat ...

  8. bzoj1030 [JSOI2007]文本生成器

    1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2654  Solved: 1100[Submit][Stat ...

  9. C++之路进阶——bzoj1030(文本生成器)

    F.A.Qs Home Discuss ProblemSet Status Ranklist Contest ModifyUser  hyxzc Logout 捐赠本站 Notice:由于本OJ建立在 ...

随机推荐

  1. 机器学习---python环境搭建

    一 安装python2.7 去https://www.python.org/downloads/ 下载,然后点击安装,记得记住你的安装路径,然后去设置环境变量,这些自行百度一下就好了. 由于2.7没有 ...

  2. mysql数据库中标的key的含义

    四种Key: Primary Key, Unique Key, Key 和 Foreign Key. 1.如果Key是空的, 那么该列值的可以重复, 表示该列没有索引, 或者是一个非唯一的复合索引的非 ...

  3. python数据库操作常用功能使用详解(创建表/插入数据/获取数据)

    实例1.取得MYSQL版本 复制代码 代码如下: # -*- coding: UTF-8 -*-#安装MYSQL DB for pythonimport MySQLdb as mdbcon = Non ...

  4. 自然语言18.1_Named Entity Recognition with NLTK

    QQ:231469242 欢迎nltk爱好者交流 https://www.pythonprogramming.net/named-entity-recognition-nltk-tutorial/?c ...

  5. 9月12日JavaScript脚本语言

    JS脚本语言 JS脚本语言全称JavaScript,是网页里面使用的脚本语言,也是一门非常强大的语言. 一.基础语法 1.注释语法 单行注释:// 多行注释:/**/ 2.输出语法 ①alert(信息 ...

  6. addEventListener进一步了解

    <body> <button id="loading" a="xx"></button> <script type=& ...

  7. 无忧之道:Docker中容器的备份、恢复和迁移

    原创:LCTT https://linux.cn/article-5967-1.html译者: GOLinux本文地址:https://linux.cn/article-5967-1.html 201 ...

  8. Ajax– 刷新页面 【转】

    jquery刷新页面(局部及全页面刷新) 2009-12-31 11:39:32|  分类: javascript|举报|字号 订阅 局部刷新: 这个方法就多了去了,常见的有以下几种: $.get方法 ...

  9. 将图片部署在tomcat/iportWork/uploadFiles中

    将图片部署在tomcat/iportWork/uploadFiles中 1.在将运行的tomcat目录下创建个二级目录iportWork\uploadFiles,如下图:

  10. 分享php中四种webservice实现的简单架构方法及实例

    一:PHP本身的SOAP所有的webservice都包括服务端(server)和客户端(client).要使用php本身的soap首先要把该拓展安装好并且启用.下面看具体的code首先这是服务端实现: ...