bzoj [Sdoi2014]数数 AC自动机上dp
[Sdoi2014]数数
Time Limit: 10 Sec Memory Limit: 512 MB
Submit: 1264 Solved: 636
[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
AC自动机建好后f[i][j][k]表示i这个点j长度k=0表示小于,1表示等于
这样转移很好转移 IL的复杂度随便跑,
虑到不能有前导零,所以填每一位的时候可以把根节点单独转移一次1~9
#pragma GCC optimzie(2)
#pragma G++ optimize(2)
#include<cstring>
#include<cmath>
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue> #define ll long long
#define N 2007
#define mod 1000000007
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-;ch=getchar();}
while(isdigit(ch)){x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*f;
} int m,len,l;
ll ans;
struct Node
{
int c[],suf;
bool flag;
}trie[N];
int cnt=,rt=;
ll f[][][];
char ch[N],n[N]; void insert()
{
int now=rt;
for (int i=;i<=len;i++)
if(trie[now].c[ch[i]-''])now=trie[now].c[ch[i]-''];
else
{
trie[now].c[ch[i]-'']=++cnt;
now=cnt;
}
trie[now].flag=true;
}
void make_AC()
{
for (int i=;i<;i++)
trie[].c[i]=;
queue<int>q;q.push();
trie[].suf=;
while(!q.empty())
{
int u=q.front();q.pop();
for (int i=;i<;i++)
if(trie[u].c[i])
{
trie[trie[u].c[i]].suf=trie[trie[u].suf].c[i];
if(trie[trie[trie[u].c[i]].suf].flag)trie[trie[u].c[i]].flag=true;
q.push(trie[u].c[i]);
}
else trie[u].c[i]=trie[trie[u].suf].c[i];
}
}
void solve()
{
/*f[0][1][1]=1;
for (int i=0;i<l;i++)
for (int j=1;j<=cnt;j++)
{
if (f[i][j][1]&&!trie[j].flag)
{
for (int k=0;k<10;k++)
if (n[i+1]-'0'>k)(f[i+1][trie[j].c[k]][0]+=f[i][j][1])%=mod;
else if(n[i+1]-'0'==k)(f[i+1][trie[j].c[k]][1]+=f[i][j][1])%=mod;
}
if(f[i][j][0]&&!trie[j].flag)
{
for (int k=0;k<10;k++)
(f[i+1][trie[j].c[k]][0]+=f[i][j][0])%=mod;
}
}*/
for (int i=;i<=l;i++)
{
for (int z=,v=trie[].c[z];z<=;v=trie[].c[++z])
{
if(i!=||z<n[i]-'')(f[i][v][]+=)%=mod;
else if(z==n[i]-'')(f[i][v][]+=)%=mod;
}
for (int j=;j<=cnt;j++)
if(!trie[j].flag)
for (int c=,v=trie[j].c[c];c<=;v=trie[j].c[++c])
{
(f[i][v][]+=f[i-][j][])%=mod;
if(c<n[i]-'')(f[i][v][]+=f[i-][j][])%=mod;
else if(c==n[i]-'')(f[i][v][]+=f[i-][j][])%=mod;
}
} for (int i=;i<=cnt;i++)
if(!trie[i].flag)(ans+=f[l][i][]+f[l][i][])%=mod;
printf("%lld",ans);
}
int main()
{
scanf("%s",n+);l=strlen(n+);
m=read();
for (int i=;i<=m;i++)
{
scanf("%s",ch+),len=strlen(ch+);
insert();
}
make_AC(),solve();
}
bzoj [Sdoi2014]数数 AC自动机上dp的更多相关文章
- 【Luogu】P3311数数(AC自动机上DP)
题目链接 蒟蒻今天终于学会了AC自动机,感觉很稳 (后一句愚人节快乐) 这题开一个f[i][j][k]表示有没有受到限制,正在枚举第j位,来到了AC自动机的第k个节点 的方案数 随后可以刷表更新 注意 ...
- 【洛谷4045】[JSOI2009] 密码(状压+AC自动机上DP)
点此看题面 大致题意: 给你\(n\)个字符串,问你有多少个长度为\(L\)的字符串,使得这些字符串都是它的子串.若个数不大于\(42\),按字典序输出所有方案. 状压 显然,由于\(n\)很小,我们 ...
- Passwords Gym - 101174E (AC自动机上DP)
Problem E: Passwords \[ Time Limit: 1 s \quad Memory Limit: 256 MiB \] 题意 给出两个正整数\(A,B\),再给出\(n\)个字符 ...
- URAL 1158 AC自动机上的简单DP+大数
题目大意 在一种语言中的字母表中有N(N<=50)个字母,每个单词都由M(M<=50)个字母构成,因此,一共可以形成N^M个单词.但是有P(P<=10)个串是被禁止的,也就是说,任何 ...
- bzoj4032/luoguP4112 [HEOI2015]最短不公共子串(后缀自动机+序列自动机上dp)
bzoj4032/luoguP4112 [HEOI2015]最短不公共子串(后缀自动机+序列自动机上dp) bzoj Luogu 题解时间 给两个小写字母串 $ A $ , $ B $ ,请你计算: ...
- bzoj 2553 [BeiJing2011]禁忌——AC自动机+概率DP+矩阵
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2553 看了题解才会…… 首先,给定一个串,最好的划分方式是按禁忌串出现的右端点排序,遇到能填 ...
- 【JZOJ3624】【SDOI2014】数数(count) AC自动机+数位dp
题面 100 容易想到使用AC自动机来处理禁忌子串的问题: 然后在自动机上数位dp,具体是: \(f_{i,j,0/1}\)表示填了\(i\)位,当前在自动机的第\(j\)个结点上,\(0\)表示当前 ...
- 【HDU3530】 [Sdoi2014]数数 (AC自动机+数位DP)
3530: [Sdoi2014]数数 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 682 Solved: 364 Description 我们称一 ...
- BZOJ 1030 文本生成器 | 在AC自动机上跑DP
题目: http://www.lydsy.com/JudgeOnline/problem.php?id=1030 题解: 鸽 #include<cstdio> #include<al ...
随机推荐
- RedHat6.4安装图形行化界面
1.1 打开电源进入RedHat shell命令行界面 1.2 查看系统镜像包括的所有软件包组信息 [root@zhongyi-test ~]# yum grouplist Loaded ...
- JS下载文件常用的方式
下载附件(image,doc,docx, excel,zip,pdf),应该是实际工作中经常遇到一个问题:这里使用过几种方式分享出来仅供参考; 初次写可能存在问题,有问题望指出 主要了解的几个知识 ...
- C语言字符篇(五)内存函数
memcpy不可以把目的地址写成本身 但是memmove可以,因为它是先保存到临时空间 #include <string.h> void *memcpy(void *dest, con ...
- linux poll用法
相对于select来说,poll 也是在指定时间内论询一定数量的文件描述符,来测试其中是否有就绪的,不过,poll 提供了一个易用的方法,来实现 i/o 复用. 声明如下: #include < ...
- 方法的重写(Override)与重载(Overload)的含义与区别
1.Override(重写) 两同,两小,一大 两同:方法名相同,参数列表相同 两小:抛出的异常要小于等于父类,返回值类型要小于等于父类 一大:访问权限要大于等于父类 2.Overload(重载) 方 ...
- 03,Python网络爬虫第一弹《Python网络爬虫相关基础概念》
爬虫介绍 引入 为什么要学习爬虫,学习爬虫能够为我们以后的发展带来那些好处?其实学习爬虫的原因和为我们以后发展带来的好处都是显而易见的,无论是从实际的应用还是从就业上. 我们都知道,当前我们所处的时代 ...
- 第四模块:网络编程进阶&数据库开发 练习
练习题 基于queue模块实现线程池 import threading from multiprocessing import Queue class A(threading.Thread): def ...
- VS Extension+NVelocity系列(二)——让VS支持 NVelocity的智能提示(上)
一.基础概念 应该庆幸的是,VS的插件是靠着MEF实现而不是MAF,这让你所做的工作减轻了许多.如果在这之前,您已经了解了MEF的原理,我想对于VS插件的编写,您应该是很容易就能理解的.看看几个VS2 ...
- 4G来临,短视频社交分享应用或井喷
因为工作的原因,接触短视频社交应用的时间相对较多,不管是自家的微视,还是别人家的Vine.玩拍.秒拍等,都有体验过.随着时间的推移,我愈发感受到有一股似曾相识的势能正在某个地方慢慢积聚,直到今天我才猛 ...
- 天性 & 如水一般,遇强则强 —— 梦想、行为、性格
开篇声明,我博客中“小心情”这一系列,全都是日记啊随笔啊什么乱七八糟的.如果一不小心点进来了,不妨直接关掉.我自己曾经写过一段时间的日记,常常翻看,毫无疑问我的文笔是很差的,而且心情也是瞬息万变的.因 ...