正题

题目链接:https://www.luogu.com.cn/problem/P3311


题目大意

求一个不超过nnn的数字使其不包含任何sss集合中的数字串。


解题思路

很经典的ACACAC自动机上面dpdpdp,但是因为是数字所以要来点数位dpdpdp的东西,多开一维用0/10/10/1表示是否在上界,然后每次要加入一些新的值以确保没有前导000。

时间复杂度O(n∑i=1m∣si∣)O(n\sum_{i=1}^m|s_i|)O(n∑i=1m​∣si​∣)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int N=2100,P=1e9+7;
int m,cnt,siz[N],fail[N],ch[N][10],f[2][N][2];
char n[N],s[N];queue<int> q;
void Insert(char *s){int l=strlen(s),x=0;for(int i=0;i<l;i++){int c=s[i]-'0';if(!ch[x][c])ch[x][c]=++cnt;x=ch[x][c];}siz[x]++;
}
void Get_Fail(){for(int i=0;i<10;i++)if(ch[0][i])q.push(ch[0][i]);while(!q.empty()){int x=q.front();q.pop();for(int i=0;i<10;i++){if(!ch[x][i])ch[x][i]=ch[fail[x]][i];else{fail[ch[x][i]]=ch[fail[x]][i];q.push(ch[x][i]);}}}return;
}
int main()
{scanf("%s",n+1);int l=strlen(n+1);scanf("%d",&m);for(int i=1;i<=m;i++){scanf("%s",s);Insert(s);}Get_Fail();int ans=0;for(int i=1;i<=l;i++){memset(f[i&1],0,sizeof(f[i&1]));int lim=n[i]-'0';if(i==1){for(int k=1;k<lim;k++)(f[i&1][ch[0][k]][0]+=1)%=P;(f[i&1][ch[0][lim]][1]+=1)%=P;}elsefor(int k=1;k<10;k++)(f[i&1][ch[0][k]][0]+=1)%=P;for(int j=0;j<=cnt;j++){if(siz[j])continue;for(int k=0;k<10;k++)(f[i&1][ch[j][k]][0]+=f[~i&1][j][0])%=P;for(int k=0;k<lim;k++)(f[i&1][ch[j][k]][0]+=f[~i&1][j][1])%=P;(f[i&1][ch[j][lim]][1]+=f[~i&1][j][1])%=P;}}for(int i=0;i<=cnt;i++)if(!siz[i])(ans+=(f[l&1][i][0]+f[l&1][i][1])%P)%=P;printf("%d\n",ans);
}

P3311-[SDOI2014]数数【AC自动机,dp】相关推荐

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

    [BZOJ3530]数数(AC自动机,动态规划) 题面 BZOJ 题解 很套路的\(AC\)自动机+\(DP\) 首先,如果长度小于\(N\) 就不存在任何限制 直接大力\(DP\) 然后强制限制不能 ...

  2. 【BZOJ】4861: [Beijing2017]魔法咒语 AC自动机+DP+矩阵快速幂

    [题意]给定n个原串和m个禁忌串,要求用原串集合能拼出的不含禁忌串且长度为L的串的数量.(60%)n,m<=50,L<=100.(40%)原串长度为1或2,L<=10^18. [算法 ...

  3. uvalive4842(AC自动机+DP)

    题意: 给出猴子打字时打某个字母的概率,猴子最多可以敲键盘m次,问得到的长度是m的单词包含模式串的概率. 思路: AC自动机+dp. 首先,我们用模式串构造一个AC自动机,用dp[i]][j]表示当前 ...

  4. HDU 2296 Ring AC自动机 + DP

    题意:给你n个模式串,每个模式串有一个得分,让你构造出一个长度为N之内且分数最高的文本串;输出字典序列最小的. 解题思路:  AC自动机 + DP , 不过要输出字典序列最小,多开一个 一个三维字符串 ...

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

    1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 5187  Solved: 2136 [Submit][St ...

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

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

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

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

  8. Codeforces 1015F Bracket Substring AC自动机 + dp

    Bracket Substring 这么垃圾的题怎么以前都不会写啊, 现在一眼怎么就会啊.... 考虑dp[ i ][ j ][ k ][ op ] 表示 已经填了 i 个空格, 末尾串匹配到 所给串 ...

  9. 牛客 - Connie(AC自动机+dp/KMP+dp)

    题目链接:点击查看 题目大意:给出一个匹配串 sss,现在问模式串 ttt 的期望得分.其中假设匹配串在模式串中的出现次数为 xxx,那么将得到 2x2^x2x 的分数 题目分析:涉及到了期望一开始还 ...

最新文章

  1. 在Google Android模拟器中使用SD卡(命令行和eclipse环境)
  2. Atitit. 软件GUIbutton与仪表盘--webserver区--获取apache配置文件路径 linux and apache的启动、停止、重新启动...
  3. 目录config.php怎么修改域名,config.php · wlphp/基于宝塔面板api给站点新增删除域名接口 - Gitee.com...
  4. 没有可用于当前位置的源代码
  5. 在c++中使用gotoxy
  6. SpringCloud 微服务
  7. Android 获取设备ID,手机厂商,运营商,联网方式,获取系统语言,获取时区
  8. MySQL安装之后没有MySQL数据库的原因
  9. Repeater内部排序
  10. 转帖一则——从医学角度论成熟
  11. 关于浏览器中copy, cut, paste捕获的总结
  12. win10 桌面背景最短切换时间由1分钟改为10秒
  13. 尼康1c全站仪语言设置,尼康NIVO.1C全站仪
  14. Google永久允许使用Flash 100%详细简单+解决
  15. 电子手表,硬核拆解,内部结构
  16. QTableWidget 数据添加与表头设置
  17. word尾注编辑参考文献
  18. 导出数据提示--secure-file-priv选项问题的解决方法
  19. 物联网-位置信息、定位技术与位置服务
  20. 计算机网络设备安装调试,网络设备安装与调试

热门文章

  1. c语言逆序数输三个数,C语言求助!一个三位数的逆序数,总是编不对
  2. linux lua socket编程,CentOs 安装lua,luasocket
  3. python训练词库_在Python中训练NGramModel
  4. 在c语言程序中将数据分为两种,2012年计算机二级C语言考点归纳汇总(一至四章)...
  5. mybatis plus 批量保存_mybatis源码分析
  6. 算法设计与分析——递归与分治策略——全排列
  7. Excel学习使用教程
  8. 数据结构——从叶子结点到根节点的全部路径
  9. 数据结构——二叉树的最长路径问题
  10. java并发练习之快乐影院