【BZOJ3530】数数(AC自动机,动态规划)

题面

BZOJ

题解

很套路的\(AC\)自动机+\(DP\)
首先,如果长度小于\(N\)
就不存在任何限制
直接大力\(DP\)
然后强制限制不能走到带有标记的点上面

如果长度恰好为\(N\)的长度
那么,要考虑是否恰好卡在范围里面
于是\(DP\)状态多记一维
表示是否卡在范围里面

最后求一下和就行啦

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define MAX 2000
#define MOD 1000000007
struct Node
{int vis[10];int lt,fail;
}t[MAX];
int tot,m;
char N[MAX],ch[MAX];
int f[MAX][MAX][2],g[MAX][MAX];
void insert(char *s)
{scanf("%s",s+1);int l=strlen(s+1),now=0;for(int i=1;i<=l;++i){if(!t[now].vis[s[i]-48])t[now].vis[s[i]-48]=++tot;now=t[now].vis[s[i]-48];}t[now].lt=1;
}
void GetFail()
{queue<int> Q;for(int i=0;i<=9;++i)if(t[0].vis[i])Q.push(t[0].vis[i]);while(!Q.empty()){int u=Q.front();Q.pop();t[u].lt|=t[t[u].fail].lt;for(int i=0;i<=9;++i)if(t[u].vis[i])t[t[u].vis[i]].fail=t[t[u].fail].vis[i],Q.push(t[u].vis[i]);else t[u].vis[i]=t[t[u].fail].vis[i];}
}
int main()
{scanf("%s",N+1);scanf("%d",&m);while(m--)insert(ch);GetFail();int l=strlen(N+1);long long ans=0;g[0][0]=1;for(int i=0;i<l;++i)for(int u=0;u<=tot;++u)if(!t[u].lt){for(int k=0;k<=9;++k)if(!t[t[u].vis[k]].lt){if(!i&&!k)continue;(g[i+1][t[u].vis[k]]+=g[i][u])%=MOD;}}for(int i=1;i<l;++i)for(int j=0;j<=tot;++j)ans=(ans+g[i][j])%MOD;f[0][0][1]=1;for(int i=0;i<l;++i)for(int u=0;u<=tot;++u)if(!t[u].lt){for(int k=0;k<=9;++k)if(!t[t[u].vis[k]].lt){if(!i&&!k)continue;(f[i+1][t[u].vis[k]][0]+=f[i][u][0])%=MOD;if(k<N[i+1]-48)(f[i+1][t[u].vis[k]][0]+=f[i][u][1])%=MOD;if(k==N[i+1]-48)(f[i+1][t[u].vis[k]][1]+=f[i][u][1])%=MOD;}}for(int i=0;i<=tot;++i)ans=(ans+f[l][i][0])%MOD,ans=(ans+f[l][i][1])%MOD;printf("%lld\n",ans);return 0;
}

转载于:https://www.cnblogs.com/cjyyb/p/8318541.html

【BZOJ3530】数数(AC自动机,动态规划)相关推荐

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

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

  2. [BZOJ4861][Beijing2017]魔法咒语 AC自动机+动态规划+矩阵快速幂

    对忌讳词语构建AC自动机 Fi,j F_{i,j}表示长度为 i i,匹配到AC自动机第jj位的合法串方案数 当状态数少的时候用矩阵转移 #include <bits/stdc++.h> ...

  3. P3311-[SDOI2014]数数【AC自动机,dp】

    正题 题目链接:https://www.luogu.com.cn/problem/P3311 题目大意 求一个不超过nnn的数字使其不包含任何sss集合中的数字串. 解题思路 很经典的ACACAC自动 ...

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

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

  5. 【BZOJ3530】数数(SDOI2014)-AC自动机+数位DP

    测试地址:数数 做法:本题需要用到AC自动机+数位DP. 首先看到多模式串匹配,自然想到用AC自动机来做.用AC自动机构造出状态转移图后,令f(i,j,k)f(i,j,k)f(i,j,k)为匹配了最高 ...

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

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

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

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

  8. Bzoj3530: [Sdoi2014]数数

    题面 传送门 Sol 在AC自动机上跑数位DP 设\(f[i][j][0/1]\)表示到\(n的第i位\)当前匹配到\(AC自动机的j节点\)的方案 转移就在AC自动机上跑 注意不能有前导零,可能有这 ...

  9. 【Luogu3041】视频游戏的连击(AC自动机,动态规划)

    题面链接 题解 首先构建出AC自动机 然后在AC自动机上面跑DP 转移很显然从Trie树的节点跳到他的儿子节点 但是要注意一个问题, 在计算的时候,每一个节点加入后能够 造成的贡献 要加上他的子串的贡 ...

最新文章

  1. android 6.0 log,android 6.0 logcat机制(二)logcat从logd中获取log保存到文件中
  2. 出入口控制系统工程设计规范_【理论冲刺】传说中的隐藏书目——《公园设计规范》...
  3. markdowndd
  4. php7.2 加载pgsql驱动,PHP启动:无法加载动态库PGSQL - php
  5. 【20181102T2】飞越行星带【智商题+最小瓶颈路】
  6. 免安装版的mysql步骤_mysql免安装版的安装方法及步骤
  7. [转]DevExpress GridControl 关于使用CardView的一点小结
  8. ASP.NET 2.0中的跨页面提交
  9. 3.14 在金山做的动态建模讲座
  10. 关于 XHTML 1.0 Transitional//EN 下的Relative问题
  11. Golang-PKCS8
  12. 各位大佬,别再拿人工智能当春药了!
  13. 卷宗怎么做_卷宗怎么读
  14. redis_主从复制搭建
  15. qq加群采集群成员,无痕偷人
  16. 注册服务号、订阅号流程
  17. 软件体系结构 思维导图
  18. 高版本Word保存为97-2003版本公式变图片问题
  19. 什么是linux嵌入式系统,嵌入式系统是什么
  20. 今年,你还回家过年吗?(文末有福利)

热门文章

  1. itertools chain
  2. CUDA TOOlkit Programming Guide 3. Programming Interface
  3. 图解TCPIP-传输层 UDP报文格式
  4. Python 装饰器@functools.wraps(func)
  5. 数据结构之基于Java的链接队列实现
  6. Pandas 文本数据方法 replace( )
  7. vCenter 6.7 shell 和 SSH开启
  8. Spring Boot学习总结(6)——SpringBoot解决ajax跨域请求问题的配置
  9. Myeclipse学习总结(10)——MyEclipse2014导入项目时The project was not built since its build问题...
  10. Linux学习总结(26)——Shell常用命令总结