题面



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. 懒散惯了,该收收心了,两天了,封装了一个R0下注册表类

    写得乱七八糟.   看着自己写的代码,感觉都不像自己了.   我写的代码,风格这么差了么?思路这么乱了么?   我写代码这么累么?   不像以前的我了...   这段时间,太懒散了...   该继续努 ...

  2. 【codeforces 500D】New Year Santa Network

    [题目链接]:http://codeforces.com/problemset/problem/500/D [题意] 有n个节点构成一棵树; 让你随机地选取3个不同的点a,b,c; 然后计算dis(a ...

  3. c语言学习笔记 关于double

    今天做了个简单的例子,由于没有使用正确的数据类型导致出错,下面是记录 #include <stdio.h> int main(void){ int i; double sum; doubl ...

  4. 软件-MQ-MQ:IBM MQ

    ylbtech-软件-MQ-MQ:MQ(IBM MQ) MQ传递主干,在世界屡获殊荣. 它帮您搭建企业服务总线(ESB)的基础传输层.IBM WebSphere MQ为SOA提供可靠的消息传递.它为经 ...

  5. nfsv3 vs nfsv4

    https://www.quora.com/What-is-the-difference-between-NFSv3-and-NFSv4

  6. Linq之Sum用法新体会

    1.简单应用,求数组的和,示例: , , , , , , , , , }; double numSum = numbers.Sum(); Console.WriteLine("The sum ...

  7. SpringBoot Jar应用Linux后台部署执行

    nohup java -jar shop-h5.jar > log_h5.file 2>&1 &

  8. spring-注解配置-junit整合测试-aop

    1 使用注解配置spring 1.1 步骤 导包4+2+spring-aop 1.为主配置文件引入新的命名空间(约束) 2.开启使用注解代理配置文件 3.在类中使用注解完成配置 1.2 将对象注册到容 ...

  9. Java 后端彻底解决跨域问题(CORS)

    接口调用出现跨域问题时,浏览器会报如下提示 XMLHttpRequest cannot load xxx. Request header field Authorization is not allo ...

  10. 2.android工具使用及appium启动

    1.adb devices  可以查看手机是否连接成功. 2.aapt dump badging xxx.apk  查看app信息. 3.启动appium需配置platformName和deviceN ...