【题解】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][ ...
随机推荐
- Django---定义、MVC和MTV模式、命令行工具、配置文件settings
1.什么是web框架 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞台来做表演. 对于所有的 ...
- vue组件中的样式属性--scoped
Scoped CSS Scoped CSS规范是Web组件产生不污染其他组件,也不被其他组件污染的CSS规范. vue组件中的style标签标有scoped属性时表明style里的css样式只适用于当 ...
- Java小功能大杂烩
生成UUID: import java.util.UUID; public class ProductUUID { // 随机返回前十位的UUID public static String getUU ...
- Leecode刷题之旅-C语言/python-9.回文数
/* * @lc app=leetcode.cn id=9 lang=c * * [9] 回文数 * * https://leetcode-cn.com/problems/palindrome-num ...
- 幸运三角形 南阳acm491(dfs)
幸运三角形 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 话说有这么一个图形,只有两种符号组成(‘+’或者‘-’),图形的最上层有n个符号,往下个数依次减一,形成倒 ...
- TreeMap与LinkedHashMap的区别
TreeMap是根据元素的内部比较器进行排序的,它可以根据key值的大小排序: LinkedHashMap是保持存放顺序的. TreeMap采用红黑树算法,遍历效率高: LinkedHashMap采用 ...
- Android面试收集录 文件存储
1.请描述Android SDK支持哪些文件存储技术? 使用SharePreferences保存key-value类型的数据 流文件存储(openFileOutput+openFileInput或Fi ...
- 11 TCP实现QQ聊天
1.客户端参考代码 #coding=utf-8 from socket import * # 创建socket tcpClientSocket = socket(AF_INET, SOCK_STREA ...
- (转) Sqoop使用实例讲解
原博客地址:http://blog.csdn.net/evankaka 摘要:本文主要讲了笔者在使用sqoop过程中的一些实例 一.概述与基本原理 Apache Sqoop(SQL-to-Hadoop ...
- 第一篇 Python安装与环境变量的配置
开发语言有很多种,为什么选Python? 先对各种开发语言做个初识和分类如下:高级语言:Python Java.PHP C# Go ruby C++... ---> 字节码低级语言:C.汇编 - ...