测试地址:数数
做法:本题需要用到AC自动机+数位DP。
首先看到多模式串匹配,自然想到用AC自动机来做。用AC自动机构造出状态转移图后,令f(i,j,k)f(i,j,k)f(i,j,k)为匹配了最高的iii位,匹配到AC自动机上的j" role="presentation" style="position: relative;">jjj点,卡上界的情况为kkk(k=0" role="presentation" style="position: relative;">k=0k=0k=0表示不卡上界,接下来选的数不受限制,否则反之)的方案数,那么做一个数位DP即可。注意处理数字有前导00<script type="math/tex" id="MathJax-Element-282">0</script>的情况。
感觉数位DP还是好难理解……还要多加学习……
以下是本人代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1000000007;
int n,m,rt=0,tot=0,len,ch[2010][10]={0},fail[2010];
int h,t,q[2010],nxt[2010][10];
ll f[2][2010][2]={0};
char N[2010],s[2010];
bool forb[2010]={0};void insert(int &v,int step)
{if (!v) v=++tot;if (step>=len) {forb[v]=1;return;}insert(ch[v][s[step]-'0'],step+1);
}void init()
{scanf("%s",N);n=strlen(N);scanf("%d",&m);for(int i=1;i<=m;i++){scanf("%s",s);len=strlen(s);insert(rt,0);}
}void build()
{h=t=q[1]=1;while(h<=t){int v=q[h++];for(int i=0;i<=9;i++)if (ch[v][i]){int x=fail[v];while(x&&!ch[x][i]) x=fail[x];if (!x) fail[ch[v][i]]=1;else fail[ch[v][i]]=ch[x][i];forb[ch[v][i]]=forb[ch[v][i]]||forb[fail[ch[v][i]]];q[++t]=ch[v][i];}}
}void work()
{for(int i=1;i<=tot;i++)for(int j=0;j<=9;j++){int x=i;while(x&&!ch[x][j]) x=fail[x];if (!x) nxt[i][j]=1;else nxt[i][j]=ch[x][j];}
}void add(ll &a,ll b)
{a=(a+b)%mod;
}void dp()
{int now=1,past=0;for(int i=0;i<n;i++){memset(f[now],0,sizeof(f[now]));for(int j=1;j<=tot;j++){for(int up=0;up<=1;up++)for(int k=0;k<=(up?(N[i]-'0'):9);k++)if (!forb[nxt[j][k]]){if (up&&k==(N[i]-'0')) add(f[now][nxt[j][k]][1],f[past][j][up]);else add(f[now][nxt[j][k]][0],f[past][j][up]);}if (j==1){for(int k=1;k<=(i?9:N[i]-'0');k++)if (!forb[nxt[j][k]]){if (!i&&k==N[i]-'0') add(f[now][nxt[j][k]][1],1);else add(f[now][nxt[j][k]][0],1);}}}swap(now,past);}ll ans=0;for(int i=1;i<=tot;i++)if (!forb[i]){add(ans,f[past][i][0]);add(ans,f[past][i][1]);}printf("%lld",ans);
}int main()
{init();build();work();dp();return 0;
}

【BZOJ3530】数数(SDOI2014)-AC自动机+数位DP相关推荐

  1. 【bzoj3530】[Sdoi2014]数数 AC自动机+数位dp

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

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

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

  3. zoj3494BCD Code(ac自动机+数位dp)

    l链接 这题想了好一会呢..刚开始想错了,以为用自动机预处理出k长度可以包含的合法的数的个数,然后再数位dp一下就行了,写到一半发现不对,还要处理当前走的时候是不是为合法的,这一点无法移到trie树上 ...

  4. ZOJ-3494 BCD Code (ac自动机+数位dp)

    题目链接 Problem Description Binary-coded decimal (BCD) is an encoding for decimal numbers in which each ...

  5. 数单词 (AC自动机模板题)

    数单词 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 为了能够顺利通过英语四六级考试,现在大家每天早上都会早起读英语. LYH本来以为自己在6月份的考试中可以通过六级, ...

  6. NYOJ 1085 数单词 (AC自动机模板题)

    数单词 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 为了能够顺利通过英语四六级考试,现在大家每天早上都会早起读英语. LYH本来以为自己在6月份的考试中可以通过六级, ...

  7. 【BZOJ2553】禁忌,AC自动机+期望DP+矩乘

    传送门 先考虑选最多禁忌串的问题 感受一下,如果禁忌串之间没有包含关系,一定是可以从前往后贪心搞的,直接建AC自动机跑匹配,找到一个禁忌串的末尾就回到根上,并把禁忌串数量+1 (所以起初我想的是把包含 ...

  8. Censored! POJ - 1625 AC自动机+大数DP

    题意: 给出一n种字符的字典,有p个禁用的单词, 问能组成多少个不同的长度为m的合法字符串.(m<=50) 题解: 是不是个我们之前做的题目非常非常像,题意都一样. 直接将上次写的AC自动机+矩 ...

  9. POJ 1625 Censored! (AC自动机 + 高精度 + DP)

    题目链接:Censored! 解析:AC自动机 + 高精度 + 简单DP. 字符有可能会超过128,用map映射一下即可. 中间的数太大,得上高精度. 用矩阵快速幂会超时,简单的DP就能解决时间的问题 ...

最新文章

  1. java 调用solr服务器_Solr环境搭建及IK分词的集成及solrJ的调用(一)
  2. MySQL默认配置文件位置发生改变后如何查找
  3. 重构-改善既有代码的设计:重构原则(二)
  4. linux设置挂载服务端防火墙_Linux Tomcat使用之前预配置(端口开放关闭 防火墙设置 硬盘挂载 安装文件)...
  5. win8.1计算机开启远程桌面连接不上,启动Win8.1远程桌面不得不知的方案
  6. oracle替代变量输出,【Oracle】替代变量
  7. mysql 固定符号分列显示_MySql中指定符号分割并分行展示
  8. Android 系统(167)----OTA升级常见问题
  9. 分表扩展全局序列原理_高可用_单表存储千万级_海量存储_分表扩展---MyCat分布式数据库集群架构工作笔记0025
  10. 递归法:求n个元素的全排列
  11. ProjectManage.rar 自动生成模板
  12. 打靶(递归算法) | 八皇后(回溯算法)
  13. 大地高、正高和正常高
  14. python爬取雪球网交易数据
  15. 该文件没有程序与之关联来执行该操作问题的解决
  16. macbook air从win10回到macOS Sierra
  17. 黑鲨helo支持html吗,黑鲨Helo的实用功能有哪些 黑鲨Helo的使用技巧
  18. golang 枚举 iota
  19. (新手向)零基础探究机器学习Crime_Prediction
  20. RR正显著-不显著 -负显著

热门文章

  1. 街机飞机游戏合集_立即在Internet存档上播放1,785个经典街机游戏(无需四分之一)...
  2. 温伯格 技术领导之路 ——如何弯腰更省力 怎样伸手更合理
  3. 数据结构和算法_01、内容简介
  4. 包过滤、状态化、七层防火墙
  5. 测试邮箱的smtp端口是否开启
  6. react-router4.0 访问其他页面未登录时跳到登录页
  7. K Smallest Sums
  8. 如何给select标签赋初值
  9. 怎么用c语言打开文件6,c语言中用什么来打开文件
  10. arcgis pro如何永久去无人机正射影像的黑边?