「SDOI2014」数数

题目描述

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

给定 \(N\) 和 \(S\),计算不大于 \(N\) 的幸运数个数。

输入格式

输入的第一行包含整数 \(N\)。
接下来一行一个整数 \(M\),表示 \(S\) 中元素的数量。 接下来 \(M\) 行,每行一个数字串,表示 \(S\) 中的一个元素。

输出格式

输出一行一个整数,表示答案模 \(10^9+7\) 的值。

数据范围与提示

我们以 \(l\) 表示 \(N\) 的长度,\(L\) 表示 \(S\) 中所有串长度之和。
对于所有数据,\(1 \leq l \leq 1200 ,\ 1 \leq M \leq 100 ,\ 1 \leq L \leq 1500\)。


关于多子串的东西可以想到AC自动机,可以在上面dp。

\(dp_{i,j,0/1}\)代表\(i\sim n\)位数字目前在AC自动机上匹配到节点\(j\)是否有最高位限制。

最后一位可以像数位dp那样非常简单的转移,有个坑点是\(S\)中有前导\(0\),但是\(N\)中没有。

有一种简单的处理方法是在建完AC自动机后把边\(ch[root][0]\)删掉


Code:

#include <cstdio>
#include <cstring>
const int mod=1e9+7;
const int N=1520;
inline void add(int &x,int y){x=x+y>=mod?x+y-mod:x+y;}
char s[N],t[N];
int ch[N][10],endro[N],fail[N],tot,q[N],l=1,r,bit[N],dp[N][N][2];
void ins()
{scanf("%s",s+1);int n=strlen(s+1),now=0;for(int i=1;i<=n;i++){if(!ch[now][s[i]-'0']) ch[now][s[i]-'0']=++tot;now=ch[now][s[i]-'0'];}endro[now]=1;
}
void build()
{for(int i=0;i<10;i++)if(ch[0][i])q[++r]=ch[0][i];while(l<=r){int now=q[l++];for(int i=0;i<10;i++){if(ch[now][i]) fail[q[++r]=ch[now][i]]=ch[fail[now]][i];else ch[now][i]=ch[fail[now]][i];}}ch[0][0]=0;
}
int main()
{scanf("%s",t+1);int n=strlen(t+1),m;for(int i=1;i<=n;i++) bit[i]=t[n+1-i]-'0';scanf("%d",&m);for(int i=1;i<=m;i++) ins();build();dp[n+1][0][1]=1;for(int i=n+1;i>1;i--)for(int j=0;j<=tot;j++)for(int l=0;l<=1;l++)for(int k=0,u=l?bit[i-1]:9;k<=u;k++){int to=ch[j][k];if(!endro[to]) add(dp[i-1][to][l&k==bit[i-1]],dp[i][j][l]);}int ans=mod-1;for(int i=0;i<=tot;i++) add(ans,dp[1][i][0]),add(ans,dp[1][i][1]);printf("%d\n",ans);return 0;
}

2019.2.21

转载于:https://www.cnblogs.com/butterflydew/p/10411119.html

「SDOI2014」数数 解题报告相关推荐

  1. 「ZJOI2016」大森林 解题报告

    「ZJOI2016」大森林 神仙题... 很显然线段树搞不了 考虑离线操作 我们只搞一颗树,从位置1一直往后移动,然后维护它的形态试试 显然操作0,1都可以拆成差分的形式,就是加入和删除 因为保证了操 ...

  2. tyvj P2018 「Nescafé26」小猫爬山 解题报告

    P2018 「Nescafé26」小猫爬山 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 Freda和rainbow饲养了N只小猫,这天,小猫们要去爬山.经 ...

  3. 「JLOI2015」战争调度 解题报告

    「JLOI2015」战争调度 感觉一到晚上大脑就宕机了... 题目本身不难,就算没接触过想想也是可以想到的 这个满二叉树的深度很浅啊,每个点只会和它的\(n-1\)个祖先匹配啊 于是可以暴力枚举祖先链 ...

  4. 「CH2101」可达性统计 解题报告

    CH2101 可达性统计 描述 给定一张N个点M条边的有向无环图,分别统计从每个点出发能够到达的点的数量.N,M≤30000. 输入格式 第一行两个整数N,M,接下来M行每行两个整数x,y,表示从x到 ...

  5. 「CH2401」送礼物 解题报告

    CH2401 送礼物 描述 作为惩罚,GY被遣送去帮助某神牛给女生送礼物(GY:貌似是个好差事)但是在GY看到礼物之后,他就不这么认为了.某神牛有N个礼物,且异常沉重,但是GY的力气也异常的大(-_- ...

  6. LOJ#6103. 「2017 山东二轮集训 Day2」第一题 解题报告

    LOJ#6103. 「2017 山东二轮集训 Day2」第一题 解题报告 前置知识:闭区间上的连续函数的零点存在性定理: 我们定义这样的函数: 定义域为 [ l , r ] ∩ Z [l,r]\cap ...

  7. 用typescript完成倒计时_「干货」将数十万行CoffeeScript代码迁移到TypeScript

    作者 | David Goldstein 译者 | 王强 策划 | 小智 转发链接:https://mp.weixin.qq.com/s/TK7kWXX4hR3e-jtpVMuBnw 序言 2017 ...

  8. 「洛谷P1343」地震逃生 解题报告

    P1343 地震逃生 题目描述 汶川地震发生时,四川XX中学正在上课,一看地震发生,老师们立刻带领x名学生逃跑,整个学校可以抽象地看成一个有向图,图中有n个点,m条边.1号点为教室,n号点为安全地带, ...

  9. 「BZOJ3930」「CQOI2015」选数

    Description 我们知道,从区间 [L,H] [ L , H ] [L,H]( L L L 和 H" role="presentation" style=&quo ...

最新文章

  1. 制药行业智能化发展现状趋势及建议
  2. tensorflow从入门到精通100讲(七)-TensorFlow房价预估使用Keras快速构建模型
  3. 天津大学计算机考研真题,天津大学计算机科学与技术考研真题
  4. openCV笔记(持续更新)
  5. mysql.createpool_Node.js MySQL模块中mysql.createConnection和mysql.createPool有什么区别?
  6. SpringBoot 2.x 集成Redis
  7. 一步一步写算法(之排序二叉树删除-3)
  8. jqgrid学习(二)
  9. Altera下载器使用说明 Intel(Altera)FPGA高速下载器线PL-USB2-BLASTER中文详细使用手册
  10. 2018年深圳杯论文_2018.5.21/建模日记/深圳杯
  11. 360浏览器设置语言国际化
  12. 小擦呀,这省市三级联动的数据不太准确,找份最新的吧
  13. 云计算是一种商业模式
  14. python论文排版格式_论文排版(一):三分钟了解页面设置
  15. 呵呵,海阔天空QQ群里的歪诗
  16. OpenCV —— 特征点检测之 SIFT 特征检测器
  17. 使用 Lightly 在线格式化 HTML
  18. 2023年兰州大学植物学考研上岸前辈备考经验指导
  19. 使用联邦学习解决推荐系统中的隐私泄露问题
  20. 【Linux】之【网络】相关的命令及解析[ethtool、nload、nethogs、iftop、iptraf、ifstat]

热门文章

  1. 【转】iPython入门技巧
  2. 想办法解决window刷新的问题
  3. IOS--文件管理NSFileManager
  4. css的一种预处理器 sass
  5. HDU 3072 SCC Intelligence System
  6. response.sendRedirect使用注意事项 .
  7. Ostu最大类间差方法
  8. 条款11 在operator=中处理“自我赋值”
  9. c++中union的使用,看高手们如何解释的
  10. 在MFC,Win32程序中向控制台(Console)窗口输出调试信息