题目描述

我们称一个正整数N是幸运数,当且仅当它的十进制表示中不包含数字串集合S中任意一个元素作为其子串。例如当S=(22,333,0233)时,233是幸运数,2333、20233、3223不是幸运数。 给定N和S,计算不大于N的幸运数个数。

输入输出格式

输入格式:

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

输出格式:

输出一行一个整数,表示答案模109+7的值。

AC自动机+数位DP

怎么解决?

构建Trie图

因为只有在Trie图上才能对答案DP并识别所有的非合法串

DP转移很繁琐

但是还是就那么写

i表示是否顶到上界j为第j位(N)k为第k个节点

特判长度不够的

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;
const int mod=1e9+7;
const int N=2e4+100;
char C[N];
char S[N];
struct AC_AuTo{struct Node{int vis[10];int end;int fail;}AC[N];/*int cnt;inline void Clear(int p){AC[p].end=0;AC[p].fail=0;memset(AC[p].vis,0,sizeof(AC[p].vis));}inline void Insert(string S){int R=S.length();int now=0;for(int i=0;i<R;i++){if(!AC[now].vis[S[i]-'0']){cnt++;Clear(cnt);AC[now].vis[S[i]-'0']=cnt;}now=AC[now].vis[S[i]-'0'];}AC[now].end=1;}inline void GetFail(){queue<int> Q;for(int i=0;i<10;i++){if(AC[0].vis[i]){AC[AC[0].vis[i]].fail=0;Q.push(AC[0].vis[i]);}}while(!Q.empty()){int x=Q.front();Q.pop();for(int i=0;i<10;i++){if(AC[x].vis[i]){AC[AC[x].vis[i]].fail=AC[AC[x].fail].vis[i];Q.push(AC[x].vis[i]);AC[AC[x].vis[i]].end|=AC[AC[AC[x].vis[i]].fail].end;}else AC[x].vis[i]=AC[AC[x].fail].vis[i];}}}*/int cnt;void Clear(int p){AC[p].fail=AC[p].end=0;memset(AC[p].vis,0,sizeof(AC[p].vis));}void Insert(char *S){int now=0;int len=strlen(S);for(int i=0;i<len;++i){if(!AC[now].vis[S[i]-'0']){AC[now].vis[S[i]-'0']=++cnt;Clear(cnt);}now=AC[now].vis[S[i]-'0'];}AC[now].end=1;}void GetFail(){queue<int> Q;for(int i=0;i<10;++i){if(AC[0].vis[i]){AC[AC[0].vis[i]].fail=0;Q.push(AC[0].vis[i]);}}while(!Q.empty()){int x=Q.front();Q.pop();for(int i=0;i<10;++i){if(AC[x].vis[i]){AC[AC[x].vis[i]].fail=AC[AC[x].fail].vis[i];AC[AC[x].vis[i]].end|=AC[AC[AC[x].fail].vis[i]].end;Q.push(AC[x].vis[i]);}else AC[x].vis[i]=AC[AC[x].fail].vis[i];}}}int F[2][1300][1600];int m;void Build(){cin>>m;for(int i=1;i<=m;++i){cin>>S;Insert(S);}GetFail();}void Solve(){cin>>(C+1);Build();int n=strlen(C+1); for(int i=0;i<n;++i){for(int j=0;j<=cnt;++j){if(F[0][i][j]){int len=C[i+1]-'0';for(int k=0;k<len;++k){if(!AC[AC[j].vis[k]].end)F[1][i+1][AC[j].vis[k]]=(F[1][i+1][AC[j].vis[k]]+F[0][i][j])%mod;}if(!AC[AC[j].vis[len]].end)F[0][i+1][AC[j].vis[len]]=(F[0][i+1][AC[j].vis[len]]+F[0][i][j])%mod;}if(F[1][i][j]){for(int k=0;k<=9;++k){if(!AC[AC[j].vis[k]].end)F[1][i+1][AC[j].vis[k]]=(F[1][i+1][AC[j].vis[k]]+F[1][i][j])%mod;}}if(!j){if(!i){int len=C[i+1]-'0';for(int k=1;k<len;++k){if(!AC[AC[j].vis[k]].end)F[1][i+1][AC[j].vis[k]]+=1;}                      if(!AC[AC[j].vis[len]].end)F[0][i+1][AC[j].vis[len]]+=1;}    else{for(int k=1;k<=9;++k){if(!AC[AC[j].vis[k]].end)F[1][i+1][AC[j].vis[k]]+=1;}}}}}int ans=0;for(int i=0;i<=cnt;++i){ans=(ans+F[0][n][i])%mod;ans=(ans+F[1][n][i])%mod;}cout<<ans;}
}Solution;
int main(){
//  freopen("test.in","r",stdin);Solution.Solve();
}

转载于:https://www.cnblogs.com/Leo-JAM/p/10079131.html

和Leo一起做爱字符串的好孩子之 [SDOI2014]数数相关推荐

  1. 和Leo一起做爱字符串的好孩子量子纠缠

    很好的字符串题啊 建立Trie树 纠缠的时候用并查集并起来 然后查询的时候用并查集所代表的节点查询 #include<iostream> #include<cstdio> #i ...

  2. 和Leo一起做爱数学的好孩子之[SHOI2014]概率充电器

    著名的电子产品品牌SHOI 刚刚发布了引领世界潮流的下一代电子产品-- 概率充电器: "采用全新纳米级加工技术,实现元件与导线能否通电完全由真随机数决 定!SHOI 概率充电器,您生活不可或 ...

  3. 和Leo一起做爱线段树的好孩子HDU5238 Calculator

    额 神仙题 感觉就是一个暴力啊 线段树维护的是一个类似于键值线段树的东西? 每个叶子节点才表示一个操作 而在PushUp的时候合并答案 这个咋合并? 暴力合并.我们记录下当前模意义下所有的答案 然后暴 ...

  4. 和Leo一起做爱线段树的好孩子之火车运输

    ByteLand火车站(编号0)每天都要发往全国各地N列客运火车,编号1 N.第i列火车的目的地是编号Si的火车站. 对任意车站X,都与X+1车站有铁轨直接相连,因此火车站可以看成数轴上的整数点,第i ...

  5. 做爱做的事,做有快感的事

    还是不发首页了,最近没规划,需要缓一缓.因为发首页还是要符合几点要求的,所以就先停停,不过文章还是得写. 本来十一点多就写好了,没想到洗个澡就过了十二点. ---------------------- ...

  6. C语言试题四十之使字符串中尾部的*号不得多于n个;若多于n个,则删除多于的*号;若少于或等于n个,则什么也不做,字符串中间和前面的*号不删除。

    1. 题目 请编写一个函数function,它的功能是:假定输入的字符串中只包含字母和*号.请编写函数fun,它的功能是:使字符串中尾部的*号不得多于n个:若多于n个,则删除多于的*号:若少于或等于n ...

  7. C语言试题六之使字符串的前导*号不得多于n个;若多于n个,则删除多于的*号;若少于或等于n个,则什么也不做。字符串中间和尾部的*号不删除。

    1. 题目 请编写函数function,它的功能是:字符串的前导*号不得多于n个:若多于n个,则删除多于的*号:若少于或等于n个,则什么也不做.字符串中间和尾部的*号不删除. 2 .温馨提示 C语言试 ...

  8. 【高德地图API】汇润做爱地图技术大揭秘

    原文:[高德地图API]汇润做爱地图技术大揭秘 昨日收到了高德地图微信公众号的消息推送,说有[一大波免费情趣用品正在袭来],点进去看了一眼,说一个电商公司(估计是卖情趣用品的)用高德云图制作了一张可以 ...

  9. P4844 LJJ爱数数

    题目 P4844 LJJ爱数数 本想找到莫比乌斯反演水题练练,结果直接用了两个多小时才做完 做法 \(\sum\limits_{a=1}^n\sum\limits_{b=1}^n\sum\limits ...

最新文章

  1. 【机器视觉案例】(11) 眨眼计数器,人脸关键点检测,附python完整代码
  2. CSS捡屎记 // Web开发之精通CSS
  3. Linux 如何实现 VLAN - 每天5分钟玩转 OpenStack(12)
  4. 对账模块和赊购退款、还款流程
  5. Hadoop---在window下配置安装之cygwin的安装
  6. net4.0 兼容2.0的方法
  7. (一)boost库之日期、时间
  8. 485. Max Consecutive Ones
  9. 简单介绍Python中的几种数据类型
  10. mysql cmake错误_MySQL5.5安装出现CMake错误找不到CMakelists.txt原因-阿里云开发者社区...
  11. python字符串切片用法_详解Python字符串切片
  12. 云服务器定时启动程序_过去、现在和未来:开发一款微信小程序的技术迭代全过程...
  13. docker gpu 创建 训练环境_巧用 Docker 快速部署 GPU 环境
  14. null value in entry: destinationDir=null
  15. c51流水灯实验报告汇编语言,单片机流水灯实验
  16. 网络打印机拒绝访问,无法连接处理方法汇总
  17. 入夏短裤热 教你怎么穿
  18. 计算机准备计划,你为计算机考试做好准备了吗?敬业签便签帮你制定详细复习计划...
  19. BP神经网络的详细推导
  20. 计算机专业术语session,Session

热门文章

  1. CSS 类选择器详解——CSS 多类选择器
  2. Request获取url各种信息的方法
  3. 用exists代替distinct
  4. 利用Spring的AbstractRoutingDataSource解决多数据源的读写分离问题
  5. Hiberate中Update和Merge的一个小的区别
  6. python 32位软件下载安装_Python32位官方下载-Python(开发环境工具)v3.9.1 x32 官方win版-ucbug软件站...
  7. python函数修饰参数_Python 函数参数的填坑之路
  8. matlab中double 和single数据类型的差别
  9. tensorflow 十四 强化学习Q-learning
  10. 算法中各种距离的介绍