【BZOJ 3530】【SDOI 2014】数数
http://www.lydsy.com/JudgeOnline/problem.php?id=3530
上午gty的测试题,爆0了qwq
类似文本生成器那道题,把AC自动机的转移建出来,准确地说建出了一个Trie图,然后在上面dp就可以了。
这道题因为有小于等于n的限制,所以要用类似数位dp的方法,记录卡不卡上界两个状态来转移。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1203;
int ch[N][10], tot = 1, end[N];
void insert(char *s) {
int len = strlen(s), x, tmp = 1, f;
for (int i = 0; i < len; ++i) {
x = s[i] - '0';
if (ch[tmp][x]) tmp = ch[tmp][x];
else tmp = ch[tmp][x] = ++tot;
}
end[tmp] = 1;
}
int qu[N], fail[N];
void BFS() {
int x, f, v, p = 0, q = 1; qu[1] = 1;
while (p != q) {
x = qu[++p];
for (int i = 0; i <= 9; ++i)
if (v = ch[x][i]) {
f = fail[x];
while (f && ch[f][i] == 0) f = fail[f];
fail[v] = f ? ch[f][i] : 1;
qu[++q] = v;
}
}
for (int i = 1; i <= q; ++i) {
x = qu[i];
for (int i = 0; i <= 9; ++i)
if (!ch[x][i])
ch[x][i] = ch[fail[x]][i];
}
}
char s[N], c[N];
int m, f1[N], f2[N], f3[N], f4[N], r[N];
const int p = 1000000007;
int main() {
scanf("%s", s + 1);
scanf("%d", &m);
for (int i = 1; i <= m; ++i) {
scanf("%s", c);
insert(c);
}
for (int i = 0; i < 10; ++i) if (ch[1][i] == 0) ch[1][i] = ++tot;
BFS();
int *pre0 = f1, *pre1 = f2, *now0 = f3, *now1 = f4;
int len = strlen(s + 1);
for (int i = 1; i <= len; ++i) r[i] = s[i] - '0';
for (int tmp = 1; tmp <= len; ++tmp) {
swap(pre0, now0); swap(pre1, now1);
memset(now0, 0, sizeof(int) * (tot + 1));
memset(now1, 0, sizeof(int) * (tot + 1));
if (tmp == 1) {
if (end[ch[1][r[tmp]]] == 0)
(++now1[ch[1][r[tmp]]]) %= p;
for (int i = r[tmp] - 1; i >= 1; --i)
if (end[ch[1][i]] == 0)
(++now0[ch[1][i]]) %= p;
} else {
for (int i = 9; i >= 1; --i)
if (end[ch[1][i]] == 0)
(++now0[ch[1][i]]) %= p;
}
for (int i = 2; i <= tot; ++i) {
for (int j = 0; j < 10; ++j)
if (end[ch[i][j]] == 0)
(now0[ch[i][j]] += pre0[i]) %= p;
if (end[ch[i][r[tmp]]] == 0)
(now1[ch[i][r[tmp]]] += pre1[i]) %= p;
for (int j = r[tmp] - 1; j >= 0; --j)
if (end[ch[i][j]] == 0)
(now0[ch[i][j]] += pre1[i]) %= p;
}
}
int ans = 0;
for (int i = 1; i <= tot; ++i) {
ans = (ans + now0[i]) % p;
ans = (ans + now1[i]) % p;
}
printf("%d\n", ans);
return 0;
}
【BZOJ 3530】【SDOI 2014】数数的更多相关文章
- [BZOJ 3530][Sdoi 2014]数数
阿拉~好像最近总是做到 AC 自动机的题目呢喵~ 题目的算法似乎马上就能猜到的样子…… AC 自动机 + 数位 dp 先暴力转移出 f[i][j] :表示从 AC 自动机上第 j 号节点走 i 步且不 ...
- BZOJ 3533 sdoi 2014 向量集
设(x,y)为Q的查询点,分类讨论如下:1.y>0: 最大化a*x+b*y,维护一个上凸壳三分即可 2.y<0:最大化a*x+b*y 维护一个下凸壳三分即可 我们考虑对时间建出一棵线段 ...
- 【BZOJ】【3530】【SDOI2014】数数
AC自动机/数位DP orz zyf 好题啊= =同时加深了我对AC自动机(这个应该可以叫Trie图了吧……出边补全!)和数位DP的理解……不过不能自己写出来还真是弱…… /************* ...
- BZOJ 3530: [Sdoi2014]数数 [AC自动机 数位DP]
3530: [Sdoi2014]数数 题意:\(\le N\)的不含模式串的数字有多少个,\(n=|N| \le 1200\) 考虑数位DP 对于长度\(\le n\)的,普通套路DP\(g[i][j ...
- [BZOJ 3530] [Sdoi2014] 数数 【AC自动机+DP】
题目链接:BZOJ - 3530 题目分析 明显是 AC自动机+DP,外加数位统计. WZY 神犇出的良心省选题,然而去年我太弱..比现在还要弱得多.. 其实现在做这道题,我自己也没想出完整解法.. ...
- bzoj 3530: [Sdoi2014]数数 数位dp
题目 我们称一个正整数N是幸运数,当且仅当它的十进制表示中不包含数字串集合S中任意一个元素作为其子串.例如当S=(22,333,0233)时,233是幸运数,2333.20233.3223不是幸运数. ...
- 3530: [Sdoi2014]数数
3530: [Sdoi2014]数数 链接 分析: 对给定的串建立AC自动机,然后数位dp.数位dp的过程中,记录当前在AC自动机的哪个点上,保证不能走到出现了给定串的点. 代码: #include& ...
- [BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛)
[BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛) 题面 我们知道,从区间\([L,R]\)(L和R为整数)中选取N个整数,总共有\((R-L+1)^N\)种方案.求最大公约数 ...
- 【BZOJ 3326】[Scoi2013]数数
题目描述 Fish 是一条生活在海里的鱼,有一天他很无聊,就开始数数玩.他数数玩的具体规则是: 确定数数的进制B 确定一个数数的区间[L, R] 对于[L, R] 间的每一个数,把该数视为一个字符串, ...
随机推荐
- 【HDU】6148 Valley Numer 数位DP
[算法]数位DP [题意]定义V-number为从左到看单位数字未出现先递增后递减现象的数字,求0~N中满足条件的数字个数.T<=200,lenth(n)<=100 [题解]百度之星201 ...
- mysql 索引最左原则原理
索引本质是一棵B+Tree,联合索引(col1, col2,col3)也是. 其非叶子节点存储的是第一个关键字的索引,而叶节点存储的则是三个关键字col1.col2.col3三个关键字的数据,且按照c ...
- python初步学习-python数据类型-列表(list)
列表 list 在 python 中具有非常强大的功能 定义 在python中,用方括号表示一个list:[] 在方括号里面,可以是 int,也可以是 str类型的数据,甚至也可以是Flase/Tru ...
- Linux的SMP,UMA,NUMA
SMP 是Symmetric Multi-Processing的意思,对称多处理器,一种多核结构,认为这些核是完全同构的,任务可以随便在任一个核上跑. UMA是Uniform Memory Acces ...
- 用selenium 模块控制浏览器
11.8 用selenium 模块控制浏览器selenium 模块让Python 直接控制浏览器,实际点击链接,填写登录信息,几乎就像是有一个人类用户在与页面交互.与Requests 和Beautif ...
- Oracle sql中的正则表达式
SELECT first_name, last_nameFROM employeesWHERE REGEXP_LIKE (first_name, '^Ste(v|ph)en$'); FIRST_NAM ...
- C基础 工程中常用的排序
引言 - 从最简单的插入排序开始 很久很久以前, 也许都曾学过那些常用的排序算法. 那时候觉得计算机算法还是有点像数学. 可是脑海里常思考同类问题, 那有什么用呢(屌丝实践派对装逼学院派的深情鄙视). ...
- JS面试题第一弹
1.javascript的typeof返回哪些数据类型 alert(typeof [1, 2]); //object alert(typeof 'leipeng'); //string ...
- 【软件设计】UML类图怎么看
前言 无论使用哪种语言,都离不开面向过程与面向对象两个流派,而类图是面向对象程序设计中至关重要的一种软件表达形式,如何看懂类图,并设计好的软件架构,是我们作为软件工程师必不可少的技能之一. 今天小黑把 ...
- 3:django models Making queries 高级进阶--聚合运算
在前一遍文章django models Making queries里面我们提到了django常用的一些检索数据库的内容, 下面我们来看一下更为高级的检索聚合运算 这是我们要用到的模型 class A ...