【JZOJ3624】【SDOI2014】数数(count) AC自动机+数位dp
题面


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的更多相关文章
- BZOJ 3530 [SDOI2014]数数 (Trie图/AC自动机+数位DP)
题目大意:略 裸的AC自动机+数位DP吧... 定义f[i][x][0/1]表示已经匹配到了第i位,当前位置是x,0表示没到上限,1到上限,此时数是数量 然而会出现虚拟前导零,即前几位没有数字的情况, ...
- 【HDU3530】 [Sdoi2014]数数 (AC自动机+数位DP)
3530: [Sdoi2014]数数 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 682 Solved: 364 Description 我们称一 ...
- 【bzoj3530】[Sdoi2014]数数 AC自动机+数位dp
题目描述 我们称一个正整数N是幸运数,当且仅当它的十进制表示中不包含数字串集合S中任意一个元素作为其子串.例如当S=(22,333,0233)时,233是幸运数,2333.20233.3223不是幸运 ...
- BZOJ 3530: [Sdoi2014]数数 [AC自动机 数位DP]
3530: [Sdoi2014]数数 题意:\(\le N\)的不含模式串的数字有多少个,\(n=|N| \le 1200\) 考虑数位DP 对于长度\(\le n\)的,普通套路DP\(g[i][j ...
- BZOJ3530:[SDOI2014]数数(AC自动机,数位DP)
Description 我们称一个正整数N是幸运数,当且仅当它的十进制表示中不包含数字串集合S中任意一个元素作为其子串.例如当S=(22,333,0233)时,233是幸运数,2333.20233.3 ...
- BZOJ3530[Sdoi2014]数数——AC自动机+数位DP
题目描述 我们称一个正整数N是幸运数,当且仅当它的十进制表示中不包含数字串集合S中任意一个元素作为其子串.例如当S=(22,333,0233)时,233是幸运数,2333.20233.3223不是幸运 ...
- [SDOI2014]数数 --- AC自动机 + 数位DP
[SDOI2014]数数 题目描述: 我们称一个正整数N是幸运数,当且仅当它的十进制表示中不包含数字串集合S中任意一个元素作为其子串. 例如当S=(22,333,0233)时,233是幸运数,2333 ...
- P3311 [SDOI2014]数数 AC自动机+数位DP
题意 给定一个正整数N和n个模式串,问不大于N的数字中有多少个不包含任意模式串,输出对\(1e^9+7\)取模后的答案. 解题思路 把所有模式串都加入AC自动机,然后跑数位DP就好了.需要注意的是,这 ...
- HDU-4518 吉哥系列故事——最终数 AC自动机+数位DP
题意:如果一个数中的某一段是长度大于2的菲波那契数,那么这个数就被定义为F数,前几个F数是13,21,34,55......将这些数字进行编号,a1 = 13, a2 = 21.现给定一个数n,输出和 ...
随机推荐
- 懒散惯了,该收收心了,两天了,封装了一个R0下注册表类
写得乱七八糟. 看着自己写的代码,感觉都不像自己了. 我写的代码,风格这么差了么?思路这么乱了么? 我写代码这么累么? 不像以前的我了... 这段时间,太懒散了... 该继续努 ...
- 【codeforces 500D】New Year Santa Network
[题目链接]:http://codeforces.com/problemset/problem/500/D [题意] 有n个节点构成一棵树; 让你随机地选取3个不同的点a,b,c; 然后计算dis(a ...
- c语言学习笔记 关于double
今天做了个简单的例子,由于没有使用正确的数据类型导致出错,下面是记录 #include <stdio.h> int main(void){ int i; double sum; doubl ...
- 软件-MQ-MQ:IBM MQ
ylbtech-软件-MQ-MQ:MQ(IBM MQ) MQ传递主干,在世界屡获殊荣. 它帮您搭建企业服务总线(ESB)的基础传输层.IBM WebSphere MQ为SOA提供可靠的消息传递.它为经 ...
- nfsv3 vs nfsv4
https://www.quora.com/What-is-the-difference-between-NFSv3-and-NFSv4
- Linq之Sum用法新体会
1.简单应用,求数组的和,示例: , , , , , , , , , }; double numSum = numbers.Sum(); Console.WriteLine("The sum ...
- SpringBoot Jar应用Linux后台部署执行
nohup java -jar shop-h5.jar > log_h5.file 2>&1 &
- spring-注解配置-junit整合测试-aop
1 使用注解配置spring 1.1 步骤 导包4+2+spring-aop 1.为主配置文件引入新的命名空间(约束) 2.开启使用注解代理配置文件 3.在类中使用注解完成配置 1.2 将对象注册到容 ...
- Java 后端彻底解决跨域问题(CORS)
接口调用出现跨域问题时,浏览器会报如下提示 XMLHttpRequest cannot load xxx. Request header field Authorization is not allo ...
- 2.android工具使用及appium启动
1.adb devices 可以查看手机是否连接成功. 2.aapt dump badging xxx.apk 查看app信息. 3.启动appium需配置platformName和deviceN ...