【SDOI2014】数数(补)
[SDOI2014] 数数
简要题意:
我们称一个正整数N是幸运数,当且仅当它的十进制表示中不包含数字串集合S中任意一个元素作为子串。例如当S={22,333,0233}时,233是幸运数,2333、20233、3223都不是幸运数。给定N和S,计算不大于N的幸运数个数。
分析:
这道题是 数位dp + AC自动机,之前kzsn并没有学数位dp,所以学AC自动机的时候并不怎么会。
但如今,kzsn转型换代,终于懂了一点点数位dp的皮毛。
首先我们定个dp的状态 dp[pos][x],表示数位dp到第pos位,当前数字的状态位于AC自动机的x处。
这个状态怎么转移呢?
我们枚举下一位取的数字 $i$,如果$go[x][i]$处没有标记,即表示当前没有子串在当前数中,可以转移过去。
dp[pos][x] += dp[pos-1][go[x][i]];
那么这道题就做完了!!!
好耶!记忆化的数位dp是真的好写。
#include<bits/stdc++.h>
using namespace std;
#define re register int
#define int long long const int mo = 1e9+7;
int go[2000][20], mark[2000], fail[2000], total;
void insert(string s)
{
int p=0;
for(re i=0, sz=s.length();i<sz;++i)
{
int x=s[i]-'0';
if(!go[p][x])go[p][x]=++total;
p=go[p][x];
}
mark[p]=1;
}
void build()
{
queue<int>Q;
for(re i=0;i<=9;++i)if(go[0][i])Q.push(go[0][i]);
while(!Q.empty())
{
int x=Q.front();
Q.pop(); mark[x]|=mark[fail[x]];
for(re i=0;i<=9;++i)
{
int t=go[x][i];
if(!t) go[x][i] = go[fail[x]][i];
else
{
Q.push(t);
fail[t] = go[fail[x]][i];
}
}
}
} int dp[2000][2000], num[2000];
int DFS(int pos, int x, int limit, int lead)
{
if(mark[x])return 0;
if(!pos)return 1;
int &ans = dp[pos][x];
if(!limit && ~ans) return ans; int ret = 0, up = limit ? num[pos] : 9;
for(re i=0;i<=up;++i)
{
if(i == 0 && lead) ret += DFS(pos-1, x, limit && i == up, 1);
else
{
int v = go[x][i];
if(!mark[v])
ret += DFS(pos-1, v, limit && i == up, 0);
while(ret>=mo)ret-=mo;
}
}
return limit ? ret : ans = ret;
}
int solve(string a)
{
memset(dp, -1, sizeof dp);
int len = a.length();
for(re i=0;i<len;++i) num[len-i] = a[i]-48;
return DFS(len, 0, 1, 1);
}
signed main()
{
string n;int m;
cin>>n>>m;
while(m--)
{
string s;
cin>>s;
insert(s);
}
build();
printf("%lld", ((solve(n)-1)%mo+mo)%mo);
return 0;
}
【SDOI2014】数数(补)的更多相关文章
- 【BZOJ】【3530】【SDOI2014】数数
AC自动机/数位DP orz zyf 好题啊= =同时加深了我对AC自动机(这个应该可以叫Trie图了吧……出边补全!)和数位DP的理解……不过不能自己写出来还真是弱…… /************* ...
- BZOJ3530: [Sdoi2014]数数
3530: [Sdoi2014]数数 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 322 Solved: 188[Submit][Status] ...
- 【HDU3530】 [Sdoi2014]数数 (AC自动机+数位DP)
3530: [Sdoi2014]数数 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 682 Solved: 364 Description 我们称一 ...
- BZOJ 3530: [Sdoi2014]数数 [AC自动机 数位DP]
3530: [Sdoi2014]数数 题意:\(\le N\)的不含模式串的数字有多少个,\(n=|N| \le 1200\) 考虑数位DP 对于长度\(\le n\)的,普通套路DP\(g[i][j ...
- 「SDOI2014」数数 解题报告
「SDOI2014」数数 题目描述 我们称一个正整数 \(N\) 是幸运数,当且仅当它的十进制表示中不包含数字串集合 \(S\) 中任意一个元素作为其子串. 例如当 \(S=(\)22, 333, 0 ...
- 3530: [Sdoi2014]数数
3530: [Sdoi2014]数数 链接 分析: 对给定的串建立AC自动机,然后数位dp.数位dp的过程中,记录当前在AC自动机的哪个点上,保证不能走到出现了给定串的点. 代码: #include& ...
- [SDOI2014]数数 --- AC自动机 + 数位DP
[SDOI2014]数数 题目描述: 我们称一个正整数N是幸运数,当且仅当它的十进制表示中不包含数字串集合S中任意一个元素作为其子串. 例如当S=(22,333,0233)时,233是幸运数,2333 ...
- bzoj [Sdoi2014]数数 AC自动机上dp
[Sdoi2014]数数 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1264 Solved: 636[Submit][Status][Discu ...
- [Sdoi2014]数数[数位dp+AC自动机]
3530: [Sdoi2014]数数 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 834 Solved: 434[Submit][Status][ ...
随机推荐
- 数据结构(c++)(第二版) Dijkstra最短路径算法 教学示范代码出现重大问题!
前言 去年在数据结构(c++)的Dijkstra教学算法案例中,发现了一个 bug 导致算法不能正常的运行,出错代码只是4行的for循环迭代代码. 看到那里就觉得有问题,但书中只给了关键代码的部分,其 ...
- linux 档案权限篇之一
一:预备知识 1.在linux中,任何一个档案都具有.所有者.用户组.其他用户这三种身份的个别权限. 1.所有者:即档案拥有者,由于Linux是多人多任务的系统,因此可能常常会有很多人同时使用这部主机 ...
- 【第十一篇】- Git Gitee之Spring Cloud直播商城 b2b2c电子商务技术总结
Git Gitee 大家都知道国内访问 Github 速度比较慢,很影响我们的使用. 如果你希望体验到 Git 飞一般的速度,可以使用国内的 Git 托管服务--Gitee(gitee.com). G ...
- webpack4. 使用autoprefixer 无效
解决办法: 在package.json文件中加上这个 "browserslist": [ "defaults", "not ie < 11&qu ...
- Mybatis中使用级联查询,一对多的查询
一.需求描述 自己在开发一个小程序的过程中,需要做的一个查询是稍微比较复杂的查询,根据用户信息去查询用户所对应的宠物信息. 一个用户可能对应多个宠物,所以在用户和宠物信息的对应关系就是一对多的关系. ...
- javascript/html 禁止图片缓存
更新图片, 如果图片的url没有改变, 刷新页面之后图片会使用缓存的图片 Solutions: * js改变图片链接 (添加get参数) // 假设当前这个图片的dom对象为img img.src + ...
- Fillder抓包配置
Faillder设置,完成以下设置后重启Fillder Fillder工具配置 设置端口 端口设置 (根据公司限制使用范围内的端口) 设置是否远程连接 勾选Decrypt HTTPS traffic ...
- HTML 网页开发、CSS 基础语法——三. HTML概念
1.纯文本格式 纯文本格式,就是没有任何文本修饰的,没有任何粗体,下划线,斜体,图形,符号,或者特殊字符,及特殊打印格式的文本,只保存文本,不保存其格式设置. ①格式对比 纯文本格式 富文本格式 最常 ...
- 你需要知道的MySQL&InnoDB锁都在这里
目录 一.前言 二.锁的类型 2.1 全局锁 2.2 表级锁 2.2.1 表锁 2.2.2 元数据锁(Meta Data Locks) 2.2.3 自增列锁(AUTO-INC Locks) 2.2.4 ...
- dg create datafile auto failed 排除处理
1.Environment:11.2.0.4 dg 2.Symptoms:告警描述:Wed Sep 22 14:29:15 2021Errors in file /data/app/oracle/di ...