题目描述

JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版。该软件可以随机生成一些文章―――总是生成一篇长度固定且完全随机的文章—— 也就是说,生成的文章中每个字节都是完全随机的。如果一篇文章中至少包含使用者们了解的一个单词,那么我们说这篇文章是可读的(我们称文章a包含单词b,当且仅当单词b是文章a的子串)。但是,即使按照这样的标准,使用者现在使用的GW文本生成器v6版所生成的文章也是几乎完全不可读的?。ZYX需要指出GW文本生成器 v6生成的所有文本中可读文本的数量,以便能够成功获得v7更新版。你能帮助他吗?

输入

输入文件的第一行包含两个正整数,分别是使用者了解的单词总数N (<= 60),GW文本生成器 v6生成的文本固定长度M;以下N行,每一行包含一个使用者了解的单词。这里所有单词及文本的长度不会超过100,并且只可能包含英文大写字母A..Z

输出

一个整数,表示可能的文章总数。只需要知道结果模10007的值。

样例输入

2 2
A
B

样例输出

100


题解

AC自动机+dp

由于直接求可读目数比较难求,所以我们可以求出总数和不可读数目,然后作差求解。

设f[i][j]为可读文章中第i个字符对应位置j的数目。

那么可以推出f[i][t]=f[i-1][j]。

求出每个j能够对应的t即可。

注意一下边界条件。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <queue>
  4. #define MOD 10007
  5. using namespace std;
  6. queue<int> q;
  7. int nt[6001][26] , fail[6001] , cnt[6001] , tot = 1 , f[101][6001];
  8. char str[61];
  9. int qpow(int x , int y)
  10. {
  11. int ans = 1;
  12. while(y)
  13. {
  14. if(y & 1)
  15. ans = ans * x % MOD;
  16. x = x * x % MOD;
  17. y >>= 1;
  18. }
  19. return ans;
  20. }
  21. void build()
  22. {
  23. int u , t , i;
  24. q.push(1);
  25. while(!q.empty())
  26. {
  27. u = q.front();
  28. q.pop();
  29. for(i = 0 ; i < 26 ; i ++ )
  30. {
  31. if(nt[u][i])
  32. {
  33. q.push(nt[u][i]);
  34. t = fail[u];
  35. while(t && !nt[t][i])
  36. t = fail[t];
  37. fail[nt[u][i]] = nt[t][i];
  38. cnt[nt[u][i]] |= cnt[nt[t][i]];
  39. }
  40. }
  41. }
  42. }
  43. int main()
  44. {
  45. int n , m , i , j , k , t , l , ans = 0;
  46. scanf("%d%d" , &n , &m);
  47. for(i = 0 ; i < 26 ; i ++ )
  48. nt[0][i] = 1;
  49. while(n -- )
  50. {
  51. scanf("%s" , str);
  52. l = strlen(str);
  53. t = 1;
  54. for(i = 0 ; i < l ; i ++ )
  55. {
  56. if(!nt[t][str[i] - 'A'])
  57. nt[t][str[i] - 'A'] = ++tot;
  58. t = nt[t][str[i] - 'A'];
  59. }
  60. cnt[t] = 1;
  61. }
  62. build();
  63. f[0][1] = 1;
  64. for(i = 1 ; i <= m ; i ++ )
  65. {
  66. for(j = 1 ; j <= tot ; j ++ )
  67. {
  68. if(!cnt[j] && f[i - 1][j])
  69. {
  70. for(k = 0 ; k < 26 ; k ++ )
  71. {
  72. t = j;
  73. while(!nt[t][k])
  74. t = fail[t];
  75. t = nt[t][k];
  76. f[i][t] += f[i - 1][j];
  77. f[i][t] %= MOD;
  78. }
  79. }
  80. }
  81. }
  82. for(i = 1 ; i <= tot ; i ++ )
  83. if(!cnt[i])
  84. ans = (ans + f[m][i]) % MOD;
  85. printf("%d\n" , (qpow(26 , m) - ans + 2 * MOD) % MOD);
  86. return 0;
  87. }

【bzoj1030】[JSOI2007]文本生成器 AC自动机+dp的更多相关文章

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

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

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

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

  3. BZOJ1030[JSOI2007]文本生成器——AC自动机+DP

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

  4. [Bzoj1030][JSOI2007]文本生成器(AC自动机&dp)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1030 最最最常见的多串匹配问题!题目求至少包含一个子串的方案数,则可以转化成全部方案-不 ...

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

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

  6. [JSOI2007]文本生成器 --- AC自动机 + DP

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

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

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

  8. 洛谷P4052 [JSOI2007]文本生成器 AC自动机+dp

    正解:AC自动机+dp 解题报告: 传送门! 感觉AC自动机套dp的题还挺套路的,,, 一般就先跑遍AC自动机,然后就用dp dp的状态一般都是f[i][j]:有i个字符,是ac自动机上的第j个节点, ...

  9. [bzoj1030][JSOI2007]文本生成器——AC自动机

    Brief Description 给定一些模式串,您需要求出满足以下要求的字符串的个数. 长度为m 包含任意一个模式串 Algorithm Design 以下内容来自神犇博客 首先运用补集转换,转而 ...

随机推荐

  1. 20145209刘一阳《网络对抗》Exp6信息搜集与漏洞扫描

    20145209刘一阳<网络对抗>Exp6信息搜集与漏洞扫描 实践内容 信息搜集和漏洞扫描 信息搜集 whois查询 用whois查询博客园网站的域名注册信息可以得到注册人的名字.城市等信 ...

  2. php webservice 可能存在的坑

    场景: 今天在生产机器上调用webservice失败 报 ...failed to load external entity... wget一下地址发现报500错误  把wsdl去掉再wget 发现就 ...

  3. postman使用感言

    这段时间接口测试一直使用的postman,一款谷歌接口测试插件,感受如下 优点: 1.对于中小型公司来说应该是够用的,特别是一键接口环境切换,一键设置header,作为一般的接口测试来说已经很不错了, ...

  4. CentOS 7.2 安装zabbix 3.4

    一.zabbix版本选择及部署环境说明 1.zabbix版本选择 zabbix官网地址:www.zabbix.com zabbix每半年发布一个长期支持版,目前长期支持版有2.0.3.0等,所以选择z ...

  5. (python)leetcode刷题笔记 02 Add Two Numbers

    2. Add Two Numbers You are given two non-empty linked lists representing two non-negative integers. ...

  6. python中的迭代器与生成器

    迭代器 迭代器的引入 假如我现在有一个列表l=['a','b','c','d','e'],我想取列表中的内容,那么有几种方式? 1.通过索引取值 ,如了l[0],l[1] 2.通过for循环取值 fo ...

  7. 在Arch上安装VSCode的方法

    首先去特硬去下载vscode的安装包 mkdir /tmp/vscode cd /tmp/vscode/ wget https://az764295.vo.msecnd.net/public/0.3. ...

  8. 数据库Mysql的学习(一)-启动和进入

    数据库:按照数据结构来组织储存和管理数据的仓库. Mysql是关系型数据库管理系统 Mysql安装好之后... mysql的启动 1:通过控制面板里的”服务“找到mysql右键启动即可 2:开始菜单搜 ...

  9. ntp服务:实现时间同步

    一. 引言 目前的项目为分布式系统,采用dubbo+zookeepe,排查BUG,发现各个服务器的时间不一致,遂网上查找资源,使得时间保持一致. 二. 步骤 1)以第一台服务器为“服务端”,其他台服务 ...

  10. 使用Zabbix监控rabbitmq服务

    添加rabbitmq脚本 [root@controller rabbitmq]# cd /etc/zabbix/script/rabbitmq [root@controller rabbitmq]# ...