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】数数的更多相关文章

  1. [BZOJ 3530][Sdoi 2014]数数

    阿拉~好像最近总是做到 AC 自动机的题目呢喵~ 题目的算法似乎马上就能猜到的样子…… AC 自动机 + 数位 dp 先暴力转移出 f[i][j] :表示从 AC 自动机上第 j 号节点走 i 步且不 ...

  2. BZOJ 3533 sdoi 2014 向量集

    设(x,y)为Q的查询点,分类讨论如下:1.y>0:  最大化a*x+b*y,维护一个上凸壳三分即可 2.y<0:最大化a*x+b*y  维护一个下凸壳三分即可 我们考虑对时间建出一棵线段 ...

  3. 【BZOJ】【3530】【SDOI2014】数数

    AC自动机/数位DP orz zyf 好题啊= =同时加深了我对AC自动机(这个应该可以叫Trie图了吧……出边补全!)和数位DP的理解……不过不能自己写出来还真是弱…… /************* ...

  4. BZOJ 3530: [Sdoi2014]数数 [AC自动机 数位DP]

    3530: [Sdoi2014]数数 题意:\(\le N\)的不含模式串的数字有多少个,\(n=|N| \le 1200\) 考虑数位DP 对于长度\(\le n\)的,普通套路DP\(g[i][j ...

  5. [BZOJ 3530] [Sdoi2014] 数数 【AC自动机+DP】

    题目链接:BZOJ - 3530 题目分析 明显是 AC自动机+DP,外加数位统计. WZY 神犇出的良心省选题,然而去年我太弱..比现在还要弱得多.. 其实现在做这道题,我自己也没想出完整解法.. ...

  6. bzoj 3530: [Sdoi2014]数数 数位dp

    题目 我们称一个正整数N是幸运数,当且仅当它的十进制表示中不包含数字串集合S中任意一个元素作为其子串.例如当S=(22,333,0233)时,233是幸运数,2333.20233.3223不是幸运数. ...

  7. 3530: [Sdoi2014]数数

    3530: [Sdoi2014]数数 链接 分析: 对给定的串建立AC自动机,然后数位dp.数位dp的过程中,记录当前在AC自动机的哪个点上,保证不能走到出现了给定串的点. 代码: #include& ...

  8. [BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛)

    [BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛) 题面 我们知道,从区间\([L,R]\)(L和R为整数)中选取N个整数,总共有\((R-L+1)^N\)种方案.求最大公约数 ...

  9. 【BZOJ 3326】[Scoi2013]数数

    题目描述 Fish 是一条生活在海里的鱼,有一天他很无聊,就开始数数玩.他数数玩的具体规则是: 确定数数的进制B 确定一个数数的区间[L, R] 对于[L, R] 间的每一个数,把该数视为一个字符串, ...

随机推荐

  1. 【BZOJ】4558: [JLoi2016]方

    [题意]给定有(n+1)*(m+1)个点的网格图,其中指定k个点不合法,求合法的正方形个数(四顶点合法). [算法]计数 [题解]斜着的正方形很麻烦,所以考虑每个斜正方形其外一定有正的外接正方形. 也 ...

  2. Vuejs - 花式渲染目标元素

    Vue.js是什么 摘自官方文档: Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库 ...

  3. auto-keras 测试保存导入模型

    # coding:utf-8 import time import matplotlib.pyplot as plt from autokeras import ImageClassifier# 保存 ...

  4. HDU 2199 二分

    我们可以发现这个函数是单增的,那么这样二分就好了. 反思:刚转C++,不会用scanf读入实数.(scanf("%lf",&y)) //By BLADEVIL #inclu ...

  5. 《Applying Deep Learning to Answer Selection: A Study And an Open Task》文章理解小结

    本篇论文是2015年的IBM watson团队的. 论文地址: 这是一篇关于QA问题的一篇论文: 相关论文讲解1.https://www.jianshu.com/p/48024e9f7bb22.htt ...

  6. Centos修改镜像为国内的阿里云源或者163源等国内源

    阿里安装软件镜像源 阿里云Linux安装镜像源地址:http://mirrors.aliyun.com/ 第一步:备份你的原镜像文件,以免出错后可以恢复. mv /etc/yum.repos.d/Ce ...

  7. Python代码这样写更优雅(转)

    1.变量交换 大部分编程语言中交换两个变量的值时,不得不引入一个临时变量: >>> a = 1>>> b = 2>>> tmp = a>&g ...

  8. 【转】debian下的update-rc.d的使用

    在Linux系统下,一个Services的启动.停止以及重启通常是通过/etc/init.d目录下的脚本来控制的.然而,在启动或改变运行级别时, 是在/etc/rcX.d中来搜索脚本.其中X是运行级别 ...

  9. Laravel 5.2 四、.env 文件与模型操作

    一..env文件 .env 文件是应用的环境配置文件,在配置应用参数.数据库连接.缓存处理时都会使用这个文件. // 应用相关参数 APP_ENV=local APP_DEBUG=true //应用调 ...

  10. C后端设计开发 - 第5章-内功-数据结构下卷

    正文 第5章-内功-数据结构下卷 后记 如果有错误, 欢迎指正. 有好的补充, 和疑问欢迎交流, 一块提高. 在此谢谢大家了.