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. 我要AFO啦好伤感啊

    我要AFO啦 虽然一直很垃圾 但是也很开心 接下来我要去学物理啦 原因是今天早上没有吃早餐?! 就这样把~ 白白

  2. 【STSRM10】数学上来先打表

    [算法]DP+数学计数 [题意]给出n个点(不同点之间有区别),求出满足下列条件的连边(双向边)方案(对1004535809取模): 1.每条边连接两个不同的点,每两个点之间至多有一条边. 2.不存在 ...

  3. java 连接数据库报错:Caused by: com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server time zone value '

    1.解决方法: 报错信息为: Caused by: com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server ti ...

  4. python初步学习-python数据类型-列表(list)

    列表 list 在 python 中具有非常强大的功能 定义 在python中,用方括号表示一个list:[] 在方括号里面,可以是 int,也可以是 str类型的数据,甚至也可以是Flase/Tru ...

  5. bootstrap-table组合表头

    1.效果图 2.html代码 <table id="table"></table> 3.javascript代码 $("#table") ...

  6. mysql where/having区别

    mysql> select 2-1 as a,password from mysql.user where user='root' having a>0; +---+----------- ...

  7. php中的__call()函数重载

    <?php #调用类中没有的方法时, 会自动调用__call方法重载 #第一个参数是调用时的方法名, 第二个参数为参数组成的数组 class Cat{ public function Hello ...

  8. python基础===Character string

    本文转自:python之Character string 1.python字符串 字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串,l Python不支持单 ...

  9. redis cluster 实现

    Redis cluster是一个redis官方提供的集群功能,集群节点最小3个节点,配置比较多,记录下来,以供下次使用.我在这使用的redis 4.0.6. 因为最新的ruby redis扩展需要ru ...

  10. 初学者学习Javascript很吃力怎么办?到底该如何学习Js?

      Js给初学者的印象总是那么的“杂而乱”,相信很多初学者都在找轻松学习Js的途径.在这里给大家总结一些学习Js的经验,希望能给后来的学习者探索出一条“轻松学习Js之路”. Js给人那种感觉的原因多半 ...