3530: [Sdoi2014]数数

Time Limit: 10 Sec  Memory Limit: 512 MB
Submit: 834  Solved: 434
[Submit][Status][Discuss]

Description

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

Input

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

Output

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

Sample Input

20
3
2
3
14

Sample Output

14

HINT

下表中l表示N的长度,L表示S中所有串长度之和。

1 < =l < =1200 , 1 < =M < =100 ,1 < =L < =1500

Source

#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
const int N=;
const int mod=1e9+;
int n,m,len,cnt=,b[N],c[N],w[N],fail[N],tr[N][],q[N];
char a[N];
int f[N][N][];ll ans;
inline void insert(int *s){
int now=;
for(int i=;i<=len;i++){
if(!tr[now][s[i]]) tr[now][s[i]]=++cnt;
now=tr[now][s[i]];
}
w[now]++;
}
inline void AC_mach(){
for(int i=;i<=;i++) tr[][i]=;
int p,h=,t=;q[t]=;fail[]=;
while(h!=t){
int now=q[++h];
for(int i=;i<=;i++){
if(tr[now][i]){
for(p=fail[now];!tr[p][i];p=fail[p]);
fail[tr[now][i]]=tr[p][i];
q[++t]=tr[now][i];
}
}
}
}
inline void dp(int T){
for(int i=,p;i<=cnt;i++){
for(int l=;l<=;l++){
if(w[i]||!f[T-][i][l]) continue;
for(int j=;j<=;j++){
for(p=i;!tr[p][j];p=fail[p]);
f[T][tr[p][j]][l+j>b[T]]=(f[T][tr[p][j]][l+j>b[T]]+f[T-][i][l])%mod;
if(!j) f[T][tr[p][j]][]=(f[T][tr[p][j]][]+f[T-][i][l])%mod;//前导0
}
}
}
}
int main(){
freopen("count.in","r",stdin);
freopen("count.out","w",stdout);
scanf("%s",a+);n=strlen(a+);
for(int i=;i<=n;i++) b[n-i+]=a[i]-'';
scanf("%d",&m);
for(int i=;i<=m;i++){
scanf("%s",a+);len=strlen(a+);
for(int j=;j<=len;j++) c[len-j+]=a[j]-'';
insert(c);
}
AC_mach();
f[][][]=;
for(int i=;i<=n;i++) dp(i);
for(int i=;i<n;i++){
for(int j=;j<=cnt;j++){
if(!w[j]){
ans=(ans+(ll)f[i][j][]+f[i][j][]-f[i][j][])%mod;
}
}
}
for(int i=;i<=cnt;i++){
if(!w[i]){
ans=(ans+(ll)f[n][i][]-f[n][i][])%mod;
}
}
printf("%lld",ans);
return ;
}

[Sdoi2014]数数[数位dp+AC自动机]的更多相关文章

  1. 咕咕(数位dp+AC自动机)

    咕咕(数位dp+AC自动机) 若一个字符串的字符集合是0~m-1,那么称它为m进制字符串.给出n个m进制字符串\(s_i\),每个字符串的权值为\(v_i\).对于另一个m进制字符串\(S\),设\( ...

  2. 2019.02.15 codechef Favourite Numbers(二分+数位dp+ac自动机)

    传送门 题意: 给444个整数L,R,K,nL,R,K,nL,R,K,n,和nnn个数字串,L,R,K,数字串大小≤1e18,n≤65L,R,K,数字串大小\le1e18,n\le65L,R,K,数字 ...

  3. CF 434C Tachibana Kanade's Tofu[数位dp+AC自动机]

    Solution //本代码压掉后两维 #include<cstdio> #define max(a,b) (a<b?b:a) using namespace std; inline ...

  4. BZOJ_1662_[Usaco2006 Nov]Round Numbers 圆环数_数位DP

    BZOJ_1662_[Usaco2006 Nov]Round Numbers 圆环数_数位DP Description 正如你所知,奶牛们没有手指以至于不能玩“石头剪刀布”来任意地决定例如谁先挤奶的顺 ...

  5. BZOJ_1026_[SCOI2009]windy数_数位DP

    BZOJ_1026_[SCOI2009]windy数_数位DP 题意:windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道, 在A和B之 ...

  6. 洛谷$P4045\ [JSOI2009]$密码 $dp$+$AC$自动机

    正解:$dp$+$AC$自动机+搜索 解题报告: 传送门$QwQ$ 首先显然先建个$AC$自动机,然后考虑设$f_{i,j,k}$表示长度为$i$,现在在$AC$自动机的第$j$个位置,已经表示出来的 ...

  7. [bzoj 1026]windy数(数位DP)

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1026 分析: 简单的数位DP啦 f[i][j]表示数字有i位,最高位的数值为j的windy数总 ...

  8. bzoj 1026 [SCOI2009]windy数(数位DP)

    1026: [SCOI2009]windy数 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 4550  Solved: 2039[Submit][Sta ...

  9. [BZOJ 1026] [SCOI 2009] Windy数 【数位DP】

    题目链接:BZOJ - 1026 题目分析 这道题是一道数位DP的基础题,对于完全不会数位DP的我来说也是难题.. 对于询问 [a,b] 的区间的答案,我们对询问进行差分,求 [0,b] - [0,a ...

随机推荐

  1. 【转载】struts应用在断网情况下启动报错解决办法(java/net/AbstractPlainSocketImpl.java:178:-1)

    无意间struts应用在有网络的情况下启动正常,在断网的情况下启动报错,报错代码如下图所示: SEVERE: Exception starting filter struts2 Class: java ...

  2. log4j教程 8、日志格式化

    Apache log4j 提供了各种布局对象,每一个对象都可以根据各种布局格式记录数据.另外,也可以创建一个布局对象格式化测井数据中的特定应用的方法. 所有的布局对象 - Appender对象收到 L ...

  3. Node.js 极简入门Helloworld版服务器例子

    粗浅得很,纯属备忘. // 内置http模块,提供了http服务器和客户端功能(path模块也是内置模块,而mime是附加模块) var http=require("http"); ...

  4. mysql kill process解决死锁

    mysql使用myisam的时候锁表比较多,尤其有慢查询的时候,造成死锁.这时需要手动kill掉locked的process.使他释放. (以前我都是重起服务)..惭愧啊.. 演示:(id 7是我用p ...

  5. rabbitmq 用户和授权

    官方文档 https://my.oschina.net/hncscwc/blog/262246?p=

  6. 【LeetCode】LeetCode——第14题:Longest Common Prefix

    14. Longest Common Prefix My Submissions Question Editorial Solution Total Accepted: 97052 Total Sub ...

  7. viewDidLayoutSubviews在ios7上导致应用崩溃

    在ios8中使用viewDidLayoutSubviews,应用正常运行,没有问题,但是应用在ios7上运行的时候,报错,导致应用崩溃,错误信息类似: Cannot find executable f ...

  8. Hibernate学习之单向多对一映射

    © 版权声明:本文为博主原创文章,转载请注明出处 说明:该实例是通过映射文件和注解两种方式实现的.可根据自己的需要选择合适的方式 实例: 1.项目结构 2.pom.xml <project xm ...

  9. [译]GLUT教程 - 移动镜头3

    Lighthouse3d.com >> GLUT Tutorial >> Input >> Moving the Camera III 上一节的示例中我们用键盘更改 ...

  10. django学习总结

    tips:django官方中文文档(http://python.usyiyi.cn/django/index.html),django基础教程(http://www.ziqiangxuetang.co ...