【题解】SDOI2014数数
真的很开心呢,总算是有一道完完全全由自己做出来的题目啦~
这一道题目洛谷P3311和另一道JSOI文本生成器的题目是十分相像的,dp方面几乎相同。只是<=n的约束,让这道题目必须结合数位dp的方法,新建一个维度代表之后数字的大小是否受到限制。0代表受限,1代表不受限。但是处理前导零的部分的确较为头痛,最后采取的方法是在第一次dp的时候不允许有前导零的存在,在第二次dp的时候才把这一部分的答案统计出来。所以在第二次的dp转移中,一个节点只能由父亲节点、而不能由Fail节点转移而来。
#include <bits/stdc++.h>
using namespace std;
#define maxn 2000
#define mod 1000000007
int m, cnt = , len, ans, ch[maxn][], dp[maxn][maxn][], fail[maxn];
bool error[maxn];
string n, s;
struct AC_Automation
{
void Trie_ins()
{
int now = , len = s.length();
for(int i = ; i < len; i ++)
{
if(!ch[now][s[i] - '']) ch[now][s[i] - ''] = ++ cnt;
now = ch[now][s[i] - ''];
}
error[now] = true;
} void AC_build()
{
queue <int> q;
q.push();
while(!q.empty())
{
int u = q.front();
q.pop();
for(int i = ; i < ; i ++)
{
if(ch[u][i])
{
int v = ch[u][i], k = fail[u];
while(!ch[k][i]) k = fail[k];
fail[v] = ch[k][i];
if(error[fail[v]]) error[v] = true;
q.push(v);
}
else ch[u][i] = ch[fail[u]][i];
}
}
}
}ACM; void DP(int x)
{
for(int i = ; i <= cnt; i ++)
{
if(error[i] || (!dp[x - ][i][] && !dp[x - ][i][])) continue;
for(int j = ; j < ; j ++)
{
if(x == && j == ) continue;
int k = i;
while(!ch[k][j]) k = fail[k];
int v = ch[k][j];
if(j == n[x - ] - '') dp[x][v][] = (dp[x][v][] + dp[x - ][i][]) % mod;
if(j < n[x - ] - '') dp[x][v][] = (dp[x][v][] + dp[x - ][i][]) % mod;
dp[x][v][] = (dp[x][v][] + dp[x - ][i][]) % mod;
}
}
} void DP2()
{
dp[][][] = ;
for(int x = ; x < len; x ++)
for(int i = ; i <= cnt; i ++)
{
if(error[i] || !dp[x - ][i][]) continue;
for(int j = ; j < ; j ++)
{
if(x == && j == ) continue;
int k = i;
int v = ch[k][j];
dp[x][v][] = (dp[x][v][] + dp[x - ][i][]) % mod;
}
}
for(int i = ; i < len; i ++)
for(int j = ; j <= cnt; j ++)
if(!error[j]) ans = (ans + dp[i][j][]) % mod;
} int main()
{
cin >> n;
cin >> m;
for(int i = ; i < ; i ++) ch[][i] = ;
for(int i = ; i <= m; i ++)
{
cin >> s;
ACM.Trie_ins();
}
ACM.AC_build();
len = n.length();
dp[][][] = ;
for(int i = ; i <= len; i ++) DP(i);
for(int i = ; i <= cnt; i ++)
if(!error[i]) ans = (ans + dp[len][i][] + dp[len][i][]) % mod;
memset(dp, , sizeof(dp));
DP2();
printf("%d\n", ans);
return ;
}
【题解】SDOI2014数数的更多相关文章
- 题解-[SDOI2014]数数
[SDOI2014]数数 这题的前置知识是AC自动机和dp,前置题目是 [JSOI2007]文本生成器,前置题目我写的题解 题解-[JSOI2007]文本生成器.我的讲解假设你做过上面那道题. 这题比 ...
- BZOJ3530: [Sdoi2014]数数
3530: [Sdoi2014]数数 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 322 Solved: 188[Submit][Status] ...
- 【BZOJ】【3530】【SDOI2014】数数
AC自动机/数位DP orz zyf 好题啊= =同时加深了我对AC自动机(这个应该可以叫Trie图了吧……出边补全!)和数位DP的理解……不过不能自己写出来还真是弱…… /************* ...
- 【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][ ...
随机推荐
- THINKPHP网站漏洞怎么修复解决
THINKPHP漏洞修复,官方于近日,对现有的thinkphp5.0到5.1所有版本进行了升级,以及补丁更新,这次更新主要是进行了一些漏洞修复,最严重的就是之前存在的SQL注入漏洞,以及远程代码执行查 ...
- linux下SVN CVS命令大全
1.将文件checkout到本地目录 svn checkout path(path是服务器上的目录) 例如:svn checkout svn: // 192.168. 1.1 / pro / doma ...
- C中 snprintf()函数的作用
函数原型:int snprintf(char* dest_str,size_t size,const char* format,...); 函数功能:先将可变参数 “…” 按照format的格式格式化 ...
- 用ServiceStack操作使用redis的问题
最近在学习Redis,查阅网上很多资料后使用SericeStack连接redis.在nuget中下载ServiceStack.Redis,主要使用到四个dll 但是运行之后会出现一堆奇怪问题:没有实现 ...
- 【C#】 语法糖
[C#] 语法糖 一, 扩展方法 1. 对某个类功能上的扩展 2. 特点: 使用方便,可以在不修改原代码的基础上进行扩展. 参照 linq,linq 就是一系列的扩展方法 3. 语法: 非泛型静态类, ...
- [网站日志]今天早上遭遇的CPU 100%情况
今天早上9:06左右,Windows性能监视器监测到主站的Web服务器出现了CPU 100%的情况,伴随着Requests/Sec的上升,详见下图. 上图中红色线条表示的是%Processor Tim ...
- abo dto属性验证的坑
问题回现: public class ShipmentRequestDto { public string FromPhoneNumber { get; set; } /// <summary& ...
- Qt irrlicht(鬼火)3D引擎 摄像机旋转问题
点击打开链接Irrlicht中的摄像有一个函数 setUpVector() if (m_device != 0 ) { core::vector3df rotation(y,x,0.f); m_cam ...
- 一丶人生苦短,我用python【第一篇】
1 解释器 解释器(英语:Interpreter),又译为直译器,是一种电脑程序,能够把高级编程语言一行一行直接转译运行.解释器不会一次把整个程序转译出来,只像一位"中间人",每次 ...
- c# 3D图形处理库
C#的OpenGL类库SharpGL SharpGL 可以让你在 Windows Forms 或者 WPF 应用中轻松的使用 OpenGL 开发图形应用.更多SharpGL信息 Axiom 3D En ...