【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][ ...
随机推荐
- Abp Vnext3 vue-admin-template(三获取用户信息)
因为获取用户比较简单,只需要把用户名及头像地址赋值即可(也许理解错误,如果发现请告知谢谢), 首先将src\api\usr.js中的url请求地址改为以下代码 export function getI ...
- AspectJ基于xml和基于注解
一.基于xml 执行的切入点中具体方法有返回值,则方法结束会立即执行后置通知,然后再执行环绕通知的放行之后的代码: 2.连接点即所有可能的方法,切入点是正真被切的方法,连接点方法名: 其中,只有环绕通 ...
- 这些解决 Bug 的套路,你都会了不?
最近整理了我原创的 140 篇编程经验和技术文章,欢迎大家阅读,一起成长!指路:https://t.1yb.co/ARnD 大家好,我是鱼皮. 学编程的过程中,我们会遇到各式各样的 Bug,也常常因为 ...
- minio & gitlab runner
Docker安装Minio存储服务器详解 # mkdir -p /data/minio # docker pull nexus3:8089/minio/minio # docker run -p 90 ...
- 一文梳理清楚mysql各种锁
全局锁: 1.FTWRL(读锁) 用于做全库的逻辑备份 加锁:FLUSH TABLES WITH READ LOCK 解锁:unlock tables 表级锁: 1.表锁 表锁的读锁和写锁 加锁:lo ...
- TP5用join进行查询出来后的循环id都是一样的
这是因为join将两个表的所有字段都查询,id冲突了,所以需要设置名,或指定选择一个表的id 用field('a.*')
- Orchard Core入门配方和主题
包含Orchard Core入门配方和主题 可以通过两个不同的NuGet包使用Orchard Core. OrchardCore.Application.Cms.Core.Targets Orchar ...
- jenkins+requests+pytest+allure持续集成
环境搭建参考:https://www.jianshu.com/p/fc39030d057f 总体流程:
- NLP与深度学习(五)BERT预训练模型
1. BERT简介 Transformer架构的出现,是NLP界的一个重要的里程碑.它激发了很多基于此架构的模型,其中一个非常重要的模型就是BERT. BERT的全称是Bidirectional En ...
- xmake v2.5.8 发布,新增 Pascal/Swig 程序和 Lua53 运行时支持
xmake 是一个基于 Lua 的轻量级跨平台构建工具,使用 xmake.lua 维护项目构建,相比 makefile/CMakeLists.txt,配置语法更加简洁直观,对新手非常友好,短时间内就能 ...