dp[i][j] 表示,在AC自动机中,从根节点开始,走了i条边,并且经过的点不包含危险节点,走到了j节点的路径数。

收获:

  1、正难则反

  2、一个字符串不包含给定pattern中的任何一个,则该字符串在AC自动机上走时不会走到“危险节点”。

  3、DFS可以做的事情,可以考虑DP来做。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <vector>
  4. #include <queue>
  5. #define fprintf(...)
  6. #define M 10007
  7. #define maxn 6010
  8. using namespace std;
  9.  
  10. int n, len;
  11. int son[maxn][], fail[maxn], ikey[maxn], ntot;
  12. int dp[][maxn];
  13.  
  14. void insert( const char *P ) {
  15. int n=strlen(P);
  16. int u=;
  17. for( int i=; i<n; i++ ) {
  18. int c=P[i]-'A';
  19. if( !son[u][c] ) son[u][c]=++ntot;
  20. fprintf( stderr, "%d->%d %c\n", u, son[u][c], c+'a' );
  21. u=son[u][c];
  22. }
  23. ikey[u] = true;
  24. }
  25. void build() {
  26. queue<int> qu;
  27. for( int c=; c<; c++ ) {
  28. int v=son[][c];
  29. if( !v ) continue;
  30. qu.push( v );
  31. fail[v] = ;
  32. fprintf( stderr, "fail[%d] = %d\n", v, fail[v] );
  33. }
  34. while( !qu.empty() ) {
  35. int u=qu.front();
  36. qu.pop();
  37. for( int c=; c<; c++ ) {
  38. int v=son[u][c];
  39. int w=fail[u];
  40. if( !v ) {
  41. son[u][c] = son[fail[u]][c];
  42. fprintf( stderr, "%d->%d %c\n", u, son[u][c], c+'a' );
  43. } else {
  44. while( w && !son[w][c] ) w=fail[w];
  45. fail[v] = son[w][c];
  46. fprintf( stderr, "fail[%d] = %d\n", v, fail[v] );
  47. ikey[v] |= ikey[fail[v]];
  48. qu.push( v );
  49. }
  50. }
  51. }
  52. }
  53. void work() {
  54. dp[][] = ;
  55. for( int i=; i<=len; i++ )
  56. for( int u=; u<=ntot; u++ )
  57. if( dp[i][u] ) {
  58. fprintf( stderr, "dp[%d][%d] = %d\n", i, u, dp[i][u] );
  59. for( int c=; c<; c++ ) {
  60. int v=son[u][c];
  61. if( ikey[v] ) continue;
  62. dp[i+][v] += dp[i][u];
  63. if( dp[i+][v]>=M ) dp[i+][v]-=M;
  64. }
  65. }
  66. int ans = ;
  67. for( int i=; i<=len; i++ )
  68. ans = (ans*)%M;
  69. for( int u=; u<=ntot; u++ ) {
  70. ans -= dp[len][u];
  71. if( ans< ) ans+=M;
  72. }
  73. printf( "%d\n", ans );
  74. }
  75. int main() {
  76. scanf( "%d%d", &n, &len );
  77. for( int i=; i<=n; i++ ) {
  78. char str[];
  79. scanf( "%s", str );
  80. insert( str );
  81. }
  82. build();
  83. work();
  84. }

bzoj 1030的更多相关文章

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

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

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

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1030 [题意] 给n个小串,随机构造一个长为m的大串,一个串合法当且仅当包含一个或多个 ...

  3. BZOJ 1030 [JSOI2007]文本生成器

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

  4. BZOJ 1030 [JSOI2007]文本生成器(AC自动机)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1030 [题目大意] 求出包含任意一个给定串的串数量 [题解] 我们求出不包含任意一个给 ...

  5. bzoj 1030 ac自动机

    比较容易看出来先建立ac自动机,然后在自动机上做DP,设w[0..1][i][j]为当前不包括/包括字典中的字符串,当前在自动机中走到第i个节点,完成的文本的长度为j的方案数,那么比较容易的转移w[i ...

  6. BZOJ 1030 文本生成器 | 在AC自动机上跑DP

    题目: http://www.lydsy.com/JudgeOnline/problem.php?id=1030 题解: 鸽 #include<cstdio> #include<al ...

  7. bzoj 1030: [JSOI2007]文本生成器 (ac自己主动机上的dp)

    1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 2635  Solved: 1090 [id=1030&qu ...

  8. 【BZOJ 1030】[JSOI2007]文本生成器

    [题目链接]:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1030 [题意] [题解] /* 先把AC自动机搞出来; 然后利用AC自动机,把 ...

  9. BZOJ 1030 【JSOI2007】 文本生成器

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

  10. 【BZOJ 1030】【JSOI 2007】文本生成器 AC自动机+递推

    一直不理解到底怎么做啊,想了好久$TwT$ 最后终于明白了为什么找到第一个满足条件的$fail$就计算,因为避免重复,这个回答,,, 然后$root$下面要接上26个节点,这里26个字母中不在字典内的 ...

随机推荐

  1. 一款基于react-native的弹窗提示组件

    介绍一款基于react-native的弹窗提示插件 react-native-ms , github地址:https://github.com/jiangzhenfei/react-native-ms ...

  2. window10_使用技巧

    1.系统关机文件 @echo offshutdown -s -t 0 2.终端常用命令 notepad 3.解决浏览器跨域 --disable-web-security --user-data-dir ...

  3. 树的直径(两个bfs)

    题目链接:https://cn.vjudge.net/problem/POJ-2631 树的直径:树中的最长链 具体思路:随便找一个点bfs,然后找到最长的链,然后再以找到的点作为起点进行bfs,然后 ...

  4. keypress 、keydown、keyup后触发回车

    1.keypress .keydown.keyup的区别 keypress表示键盘按下的全过程,只有按下任意字母数字键(后退.删除等系统功能键无效)时才触发,捕获到的keyCode区分大小写 keyd ...

  5. Cookie、Session 和 自定义分页

    cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...

  6. 利用__attribute__((section()))构建初始化函数表【转】

    转自: https://mp.weixin.qq.com/s?__biz=MzAwMDUwNDgxOA==&mid=2652663356&idx=1&sn=7797629530 ...

  7. 在64位ubuntu中安装代码比较工具beyond compare

    1,//从http://www.scootersoftware.com/download.php 官方地址下载 bcompare-3.3.2.14050.tar.gz 或 bcompare-4.0.7 ...

  8. Deep Learning基础--随时间反向传播 (BackPropagation Through Time,BPTT)推导

    1. 随时间反向传播BPTT(BackPropagation Through Time, BPTT) RNN(循环神经网络)是一种具有长时记忆能力的神经网络模型,被广泛用于序列标注问题.一个典型的RN ...

  9. caffe Python API 之中值转换

    # 编写一个函数,将二进制的均值转换为python的均值 def convert_mean(binMean,npyMean): blob = caffe.proto.caffe_pb2.BlobPro ...

  10. Hadoop(一):概述

    一.Hadoop是什么? Hadoop是一个由Apache基金会所开发的分布式系统基础架构.Hadoop框架最核心的设计包含两个方面,一是分布式文件系统(Hadoop Distributed File ...