3530: [Sdoi2014]数数

链接

分析:

  对给定的串建立AC自动机,然后数位dp。数位dp的过程中,记录当前在AC自动机的哪个点上,保证不能走到出现了给定串的点。

代码:

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<cmath>
  6. #include<cctype>
  7. #include<set>
  8. #include<queue>
  9. #include<vector>
  10. #include<map>
  11. using namespace std;
  12. typedef long long LL;
  13.  
  14. inline int read() {
  15. int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
  16. for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
  17. }
  18.  
  19. const int N = , mod = 1e9 + ;
  20. int ch[N][], q[N], fail[N], last[N], val[N], dp[N][N], Index;
  21. char s[N], t[N];
  22.  
  23. void Insert(char *s) {
  24. int len = strlen(s), u = ;
  25. for (int i = ; i < len; ++i) {
  26. int c = s[i] - '';
  27. if (!ch[u][c]) ch[u][c] = ++Index;
  28. u = ch[u][c];
  29. }
  30. val[u] = ;
  31. }
  32. void bfs() {
  33. int L = , R = ;
  34. for (int i = ; i < ; ++i)
  35. if (ch[][i]) q[++R] = ch[][i];
  36. while (L <= R) {
  37. int u = q[L ++];
  38. for (int c = ; c < ; ++c) {
  39. int v = ch[u][c];
  40. if (!v) ch[u][c] = ch[fail[u]][c];
  41. else fail[v] = ch[fail[u]][c], last[v] = val[fail[v]] ? fail[v] : last[fail[v]], q[++R] = v;
  42. }
  43. }
  44. }
  45. int dfs(int pos,int now,bool lim,bool fir) { // 从高位数第pos位,在AC自动机上的位置,是否有小于n的限制,是否有前导0的限制
  46. if (pos == ) return ;
  47. if (!lim && !fir && dp[pos][now] != -) return dp[pos][now];
  48. int res = , u = lim ? (s[pos] - '') : ;
  49. if (fir) res = (res + dfs(pos - , , lim && == u, )) % mod; // 如果当前依然没有出现第一个正整数作为开始,那么继续从0号点开始走,不能是ch[0][0]!!!
  50. for (int i = fir; i <= u; ++i) {
  51. int v = ch[now][i];
  52. if (val[v] || last[v]) continue; // last表示从当前点沿着fail指针跳的过程中,第一个是给定串的点
  53. res = (res + dfs(pos - , v, lim && i == u , )) % mod;
  54. }
  55. if (!lim && !fir) dp[pos][now] = res;
  56. return res;
  57. }
  58. int main() {
  59. scanf("%s", s + );
  60. int n = strlen(s + );
  61. reverse(s + , s + n + );
  62. int m = read();
  63. for (int i = ; i <= m; ++i) {
  64. scanf("%s", t);
  65. Insert(t);
  66. }
  67. bfs();
  68. memset(dp, -, sizeof(dp));
  69. cout << (dfs(n, , , ) - + mod) % mod;
  70. return ;
  71. }

3530: [Sdoi2014]数数的更多相关文章

  1. 【BZOJ】【3530】【SDOI2014】数数

    AC自动机/数位DP orz zyf 好题啊= =同时加深了我对AC自动机(这个应该可以叫Trie图了吧……出边补全!)和数位DP的理解……不过不能自己写出来还真是弱…… /************* ...

  2. BZOJ 3530: [Sdoi2014]数数 [AC自动机 数位DP]

    3530: [Sdoi2014]数数 题意:\(\le N\)的不含模式串的数字有多少个,\(n=|N| \le 1200\) 考虑数位DP 对于长度\(\le n\)的,普通套路DP\(g[i][j ...

  3. bzoj 3530: [Sdoi2014]数数 数位dp

    题目 我们称一个正整数N是幸运数,当且仅当它的十进制表示中不包含数字串集合S中任意一个元素作为其子串.例如当S=(22,333,0233)时,233是幸运数,2333.20233.3223不是幸运数. ...

  4. BZOJ3530: [Sdoi2014]数数

    3530: [Sdoi2014]数数 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 322  Solved: 188[Submit][Status] ...

  5. 【HDU3530】 [Sdoi2014]数数 (AC自动机+数位DP)

    3530: [Sdoi2014]数数 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 682  Solved: 364 Description 我们称一 ...

  6. [Sdoi2014]数数[数位dp+AC自动机]

    3530: [Sdoi2014]数数 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 834  Solved: 434[Submit][Status][ ...

  7. 「SDOI2014」数数 解题报告

    「SDOI2014」数数 题目描述 我们称一个正整数 \(N\) 是幸运数,当且仅当它的十进制表示中不包含数字串集合 \(S\) 中任意一个元素作为其子串. 例如当 \(S=(\)22, 333, 0 ...

  8. [SDOI2014]数数 --- AC自动机 + 数位DP

    [SDOI2014]数数 题目描述: 我们称一个正整数N是幸运数,当且仅当它的十进制表示中不包含数字串集合S中任意一个元素作为其子串. 例如当S=(22,333,0233)时,233是幸运数,2333 ...

  9. bzoj [Sdoi2014]数数 AC自动机上dp

    [Sdoi2014]数数 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1264  Solved: 636[Submit][Status][Discu ...

随机推荐

  1. iOS设计模式 - 享元

    iOS设计模式 - 享元 原理图 说明 享元模式使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件:它适合用于只是因重复而导致使用无法令人接受的大量内存的大量物件.通常物件中的部分 ...

  2. [控件] 创建出条形间隔效果的背景LineBackgroundView

    创建出条形间隔效果的背景LineBackgroundView 效果: 使用: // // ViewController.m // LineBackgroundView // // Created by ...

  3. 在 vSphere 5.x/6.0 中配置 Network Dump Collector 服务 (2002954)

    vmware KB: https://kb.vmware.com/s/article/2002954?lang=zh_CN 重点配置命令: 使用 vSphere Client 连接到 vCenter ...

  4. Hadoop HBase概念学习系列之HBase里的长表VS宽表VS窄表(十五)

    有时候啊,HBase表的设计方案通常,还会考虑如下一些因素,当然,这只是考虑范围里的部分呢. 更多的行还是更多的版本?后者使用了HBase自带的功能.但是需要在列簇中定义最大版本数,这样做可能有风险. ...

  5. 成为技术领导者笔记--领导的MOI模型

    一. 想让周围环境发生变化,环境必须包含三个条件: M:激励(Motivation)---有奖品或有困难,这样才对相关人员有推动力或吸引力. O:组织(organization)---利用现有的组织结 ...

  6. jquery.form.js mvc 上传文件 layer 选择框与等待效果

    HTML <form role="form" id="form1"> <div class="form-group"> ...

  7. 一篇文章搞懂DOM

    学习JavaScript肯定是会遇到DOM操作,那么什么是DOM?它又是干嘛用的?这篇文章为你揭晓答案. DOM是document object model的缩写,简称文档对象模型. 简单的说DOM是 ...

  8. [李居丽][다이아몬드][Diamond]

    歌词来源:http://music.163.com/#/song?id=484056974 作曲 : Damon Sharpe/JOHN HO/JEFF SHUM [作曲 : Damon Sharpe ...

  9. Uva821 Page Hopping (Floyd)

    题目大意: 最近的研究表明,互联网上任何一个网页在平均情况下最多只需要单击19次就能到达任 意一个其他网页.如果把网页看成一个有向图中的结点,则该图中任意两点间最短距离的平 均值为19. 输入一个n( ...

  10. 使用Yarn+Webpack+Babel6搭建React.js环境

    使用Yarn+Webpack+Babel6搭建React.js环境 Facebook开源的React.js已经改变了世人对前端UI的思考方式.这种基于组件方式的优势之一,就是使View更加的简单,因为 ...