[Sdoi2014]数数[数位dp+AC自动机]
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
3
2
3
14
Sample Output
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自动机]的更多相关文章
- 咕咕(数位dp+AC自动机)
咕咕(数位dp+AC自动机) 若一个字符串的字符集合是0~m-1,那么称它为m进制字符串.给出n个m进制字符串\(s_i\),每个字符串的权值为\(v_i\).对于另一个m进制字符串\(S\),设\( ...
- 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,数字 ...
- CF 434C Tachibana Kanade's Tofu[数位dp+AC自动机]
Solution //本代码压掉后两维 #include<cstdio> #define max(a,b) (a<b?b:a) using namespace std; inline ...
- BZOJ_1662_[Usaco2006 Nov]Round Numbers 圆环数_数位DP
BZOJ_1662_[Usaco2006 Nov]Round Numbers 圆环数_数位DP Description 正如你所知,奶牛们没有手指以至于不能玩“石头剪刀布”来任意地决定例如谁先挤奶的顺 ...
- BZOJ_1026_[SCOI2009]windy数_数位DP
BZOJ_1026_[SCOI2009]windy数_数位DP 题意:windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道, 在A和B之 ...
- 洛谷$P4045\ [JSOI2009]$密码 $dp$+$AC$自动机
正解:$dp$+$AC$自动机+搜索 解题报告: 传送门$QwQ$ 首先显然先建个$AC$自动机,然后考虑设$f_{i,j,k}$表示长度为$i$,现在在$AC$自动机的第$j$个位置,已经表示出来的 ...
- [bzoj 1026]windy数(数位DP)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1026 分析: 简单的数位DP啦 f[i][j]表示数字有i位,最高位的数值为j的windy数总 ...
- bzoj 1026 [SCOI2009]windy数(数位DP)
1026: [SCOI2009]windy数 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 4550 Solved: 2039[Submit][Sta ...
- [BZOJ 1026] [SCOI 2009] Windy数 【数位DP】
题目链接:BZOJ - 1026 题目分析 这道题是一道数位DP的基础题,对于完全不会数位DP的我来说也是难题.. 对于询问 [a,b] 的区间的答案,我们对询问进行差分,求 [0,b] - [0,a ...
随机推荐
- hive参数——深入浅出学Hive
第一部分:Hive 参数 hive.exec.max.created.files •说明:所有hive运行的map与reduce任务可以产生的文件的和 •默认值:100000 hive.exec.d ...
- OpenGL矩阵类(C++) 【转】
http://www.cnblogs.com/hefee/p/3816727.html OpenGL矩阵类(C++) 概述 创建&初始化 存取器 矩阵运算 变换函数 实例:模型视图矩阵 实例: ...
- 一个java调用python的问题
使用 ProcessBuilder List<String> commands = new ArrayList(); commands.add("python"); c ...
- 【转】VirtualBox网卡设置
原文: https://blog.csdn.net/jwpker/article/details/45870903 ------------------------------------------ ...
- 移动web之响应式布局
1.响应式布局的概念 响应式布局是Ethan Marcotte在2010年5月份提出的一个概念.简而言之.就是一个站点可以兼容多个终端--而不是为每一个终端做一个特定的版本号. 这个概念是为解决移动互 ...
- hdu4930 Fighting the Landlords(模拟 多校6)
题目链接:pid=4930">http://acm.hdu.edu.cn/showproblem.php? pid=4930 Fighting the Landlords Time L ...
- 微信小程序 - 豆瓣同城
代码地址如下:http://www.demodashi.com/demo/12121.html 一.准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.com/ ...
- CoreImage的模糊滤镜
//1.原始图片 UIImage * image = [UIImage imageNamed:@"1.jpg"]; /****************core image***** ...
- Android 函数回调
1 http://blog.csdn.net/xyz_lmn/article/details/8631195 我感觉fragment和activity的通信形象的解释了函数的回调,看别人的博客越看越迷 ...
- WCF实现上传图片功能
初次学习实现WCF winform程序的通信,主要功能是实现图片的传输. 下面是实现步骤: 第一步: 首先建立一个类库项目TransferPicLib,导入wcf需要的引用System.Service ...