题面



100

容易想到使用AC自动机来处理禁忌子串的问题;

然后在自动机上数位dp,具体是:

\(f_{i,j,0/1}\)表示填了\(i\)位,当前在自动机的第\(j\)个结点上,\(0\)表示当前数已经小于了\(N\),\(1\)表示当前数等于\(N\)。

Code

#include<bits/stdc++.h>
#define ll long long
#define fo(i,x,y) for(int i=x;i<=y;i++)
#define fd(i,x,y) for(int i=x;i>=y;i--)
using namespace std;
const char* fin="ex3624.in";
const char* fout="ex3624.out";
const int inf=0x7fffffff;
const int maxn=1507,mo=1000000007;
struct node{
int x,fa,ne[10];
}ac[maxn];
int n,m,num=1,hd,tl=1;
int f[maxn][maxn][2],ne[maxn][10],b[maxn];
char a[maxn];
void makefail(){
while (hd++<tl){
int x=b[hd];
fo(i,0,9)
if (ac[x].ne[i]){
int y=ac[x].ne[i],z=ac[x].fa;
if (x){
while (z && !ac[z].ne[i]) z=ac[z].fa;
ac[y].fa=ac[z].ne[i];
}
b[++tl]=y;
ac[y].x+=ac[ac[y].fa].x;
}
}
}
int main(){
freopen(fin,"r",stdin);
freopen(fout,"w",stdout);
scanf("%s",a+1);
n=strlen(a+1);
scanf("%d",&m);
fo(i,1,m){
char ch=getchar();
int p=0;
while (ch<'0' || ch>'9') ch=getchar();
while (ch>='0' && ch<='9'){
int x=ch-'0';
if (!ac[p].ne[x]) ac[p].ne[x]=++num;
p=ac[p].ne[x];
ch=getchar();
}
ac[p].x++;
}
makefail();
fo(i,0,num){
if (i==1){
ne[1][0]=1;
fo(j,1,9) ne[1][j]=ne[0][j];
continue;
}
fo(j,0,9){
int x=ac[i].ne[j],y=ac[i].fa;
if (x){
if (ac[x].x) ne[i][j]=-1;
else ne[i][j]=x;
}else{
while (y && !ac[y].ne[j]) y=ac[y].fa;
if (ac[ac[y].ne[j]].x) ne[i][j]=-1;
else ne[i][j]=ac[y].ne[j];
}
}
}
memset(f,0,sizeof f);
f[0][1][0]=1;
fo(i,0,n-1)
fo(x,0,num){
fo(y,0,9){
if (ne[x][y]==-1) continue;
int z=ne[x][y],xc=a[i+1]-'0';
if (y<=xc){
if (y<xc) f[i+1][z][1]=(f[i+1][z][1]+f[i][x][0])%mo;
else f[i+1][z][0]=(f[i+1][z][0]+f[i][x][0])%mo;
}
f[i+1][z][1]=(f[i+1][z][1]+f[i][x][1])%mo;
}
}
int ans=0;
fo(x,0,num) ans=((ans+f[n][x][0])%mo+f[n][x][1])%mo;
ans--;
printf("%d",ans);
return 0;
}

【JZOJ3624】【SDOI2014】数数(count) AC自动机+数位dp的更多相关文章

  1. BZOJ 3530 [SDOI2014]数数 (Trie图/AC自动机+数位DP)

    题目大意:略 裸的AC自动机+数位DP吧... 定义f[i][x][0/1]表示已经匹配到了第i位,当前位置是x,0表示没到上限,1到上限,此时数是数量 然而会出现虚拟前导零,即前几位没有数字的情况, ...

  2. 【HDU3530】 [Sdoi2014]数数 (AC自动机+数位DP)

    3530: [Sdoi2014]数数 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 682  Solved: 364 Description 我们称一 ...

  3. 【bzoj3530】[Sdoi2014]数数 AC自动机+数位dp

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

  4. BZOJ 3530: [Sdoi2014]数数 [AC自动机 数位DP]

    3530: [Sdoi2014]数数 题意:\(\le N\)的不含模式串的数字有多少个,\(n=|N| \le 1200\) 考虑数位DP 对于长度\(\le n\)的,普通套路DP\(g[i][j ...

  5. BZOJ3530:[SDOI2014]数数(AC自动机,数位DP)

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

  6. BZOJ3530[Sdoi2014]数数——AC自动机+数位DP

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

  7. [SDOI2014]数数 --- AC自动机 + 数位DP

    [SDOI2014]数数 题目描述: 我们称一个正整数N是幸运数,当且仅当它的十进制表示中不包含数字串集合S中任意一个元素作为其子串. 例如当S=(22,333,0233)时,233是幸运数,2333 ...

  8. P3311 [SDOI2014]数数 AC自动机+数位DP

    题意 给定一个正整数N和n个模式串,问不大于N的数字中有多少个不包含任意模式串,输出对\(1e^9+7\)取模后的答案. 解题思路 把所有模式串都加入AC自动机,然后跑数位DP就好了.需要注意的是,这 ...

  9. HDU-4518 吉哥系列故事——最终数 AC自动机+数位DP

    题意:如果一个数中的某一段是长度大于2的菲波那契数,那么这个数就被定义为F数,前几个F数是13,21,34,55......将这些数字进行编号,a1 = 13, a2 = 21.现给定一个数n,输出和 ...

随机推荐

  1. python3-常用模块之openpyxl(2)封装

    简单封装了下openpyxl,仅供参考,openpyxl版本2.6.2#操作存在的文件from openpyxl import Workbookfrom openpyxl import load_wo ...

  2. <数据库>MySQL补充( 查询)

    show create table 表名 \G;(查看创建的属性) alter table 表名 auto_increment=xx;(修改自增起始值) set session auto_increm ...

  3. mysql下突然丢失权限

    mysql  Can't read dir of  今天打开mysql数据库突然报了这个错误 查后发现是表没权限,进行了mysql的data目录权限修改 1.show global variables ...

  4. Leetcode946. Validate Stack Sequences验证栈序列

    给定 pushed 和 popped 两个序列,只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时,返回 true:否则,返回 false . 示例 1: 输入:pus ...

  5. _strupr _wcsupr _mbsupr

    将字符串转化为大写的形式(Convert a string to uppercase.)定义: char *_strupr( char *string ); wchar_t *_wcsupr( wch ...

  6. CODE[VS]4633:Mz树链剖分练习

    Description 给定一棵结点数为n的树,初始点权均为0,有依次q个操作,每次操作有三个参数a,b,c,当a=1时,表示给b号结点到c号结点路径上的所有点(包括b,c,下同)权值都增加1,当a= ...

  7. nextjs服务端渲染原理

    1. 简单的介绍一下 nextjs是react进行服务端渲染的一个工具,默认以根目录下的pages为渲染路由 比如我在pages目录下创建一个index.js文件,然后export default一个 ...

  8. 创建一个欢迎 cookie 利用用户在提示框中输入的数据创建一个 JavaScript Cookie,当该用户再次访问该页面时,根据 cookie 中的信息发出欢迎信息。

    创建一个欢迎 cookie 利用用户在提示框中输入的数据创建一个 JavaScript Cookie,当该用户再次访问该页面时,根据 cookie 中的信息发出欢迎信息. <html> & ...

  9. 多表关联懒加载导致的org.hibernate.LazyInitializationException: could not initialize proxy - no Session

    本来考虑的是懒加载,这样可以提高效率,不过由于时间紧急 把懒加载改为急加载临时解决 https://www.jianshu.com/p/89520964f458 自己管理session也可以 临时补丁 ...

  10. SpringData初探

    前言 项目中用到这个,没有学过,手动搭建,测试执行流程, 理论的东西有时间再补充 Maven依赖 <?xml version="1.0" encoding="UTF ...