P3311 [SDOI2014]数数 AC自动机+数位DP】的更多相关文章

3530: [Sdoi2014]数数 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 682  Solved: 364 Description 我们称一个正整数N是幸运数,当且仅当它的十进制表示中不包含数字串集合S中任意一个元素作为其子串.例如当S=(22,333,0233)时,233是幸运数,2333.20233.3223不是幸运数.    给定N和S,计算不大于N的幸运数个数. Input 输入的第一行包含整数N.    接下来一行一个整数M,…
题面 100 容易想到使用AC自动机来处理禁忌子串的问题: 然后在自动机上数位dp,具体是: \(f_{i,j,0/1}\)表示填了\(i\)位,当前在自动机的第\(j\)个结点上,\(0\)表示当前数已经小于了\(N\),\(1\)表示当前数等于\(N\). Code #include<bits/stdc++.h> #define ll long long #define fo(i,x,y) for(int i=x;i<=y;i++) #define fd(i,x,y) for(int…
题目描述 我们称一个正整数N是幸运数,当且仅当它的十进制表示中不包含数字串集合S中任意一个元素作为其子串.例如当S=(22,333,0233)时,233是幸运数,2333.20233.3223不是幸运数.给定N和S,计算不大于N的幸运数个数. 输入 输入的第一行包含整数N.接下来一行一个整数M,表示S中元素的数量.接下来M行,每行一个数字串,表示S中的一个元素. 输出 输出一行一个整数,表示答案模109+7的值. 样例输入 20 3 2 3 14 样例输出 14 题解 AC自动机+数位dp 同学…
题目大意:略 裸的AC自动机+数位DP吧... 定义f[i][x][0/1]表示已经匹配到了第i位,当前位置是x,0表示没到上限,1到上限,此时数是数量 然而会出现虚拟前导零,即前几位没有数字的情况,实际上是在0号节点原地打转,所以多加一维状态,再额外讨论第1位就行了 #include <cmath> #include <queue> #include <vector> #include <cstdio> #include <cstring> #…
题意 给定一个正整数N和n个模式串,问不大于N的数字中有多少个不包含任意模式串,输出对\(1e^9+7\)取模后的答案. 解题思路 把所有模式串都加入AC自动机,然后跑数位DP就好了.需要注意的是,这题需要考虑前导0的影响.举个栗子,对于N=2333,在处理数字233时其实处理的是"0233",这时如果不考虑前导0且模式串又包含"0233"的话就会出错. 消除前导0的影响也很简单,特判一下就可以了,具体请见代码. AC代码 #include<bits/stdc…
3530: [Sdoi2014]数数 题意:\(\le N\)的不含模式串的数字有多少个,\(n=|N| \le 1200\) 考虑数位DP 对于长度\(\le n\)的,普通套路DP\(g[i][j]\)即可 对于长度\(=n\)的,需要考虑天际线,\(f[i][j][0/1]\)表示从高开始i位走到节点j,是否卡上界的方案数 需要注意的是前导0的处理,不能出现前导0,所以\(f[0]\)往外转移的时候不能走0 #include <iostream> #include <cstdio&…
Description 我们称一个正整数N是幸运数,当且仅当它的十进制表示中不包含数字串集合S中任意一个元素作为其子串.例如当S=(22,333,0233)时,233是幸运数,2333.20233.3223不是幸运数. 给定N和S,计算不大于N的幸运数个数. Input 输入的第一行包含整数N. 接下来一行一个整数M,表示S中元素的数量. 接下来M行,每行一个数字串,表示S中的一个元素. Output 输出一行一个整数,表示答案模109+7的值. Sample Input 20 3 2 3 14…
题目描述 我们称一个正整数N是幸运数,当且仅当它的十进制表示中不包含数字串集合S中任意一个元素作为其子串.例如当S=(22,333,0233)时,233是幸运数,2333.20233.3223不是幸运数.    给定N和S,计算不大于N的幸运数个数. 输入 输入的第一行包含整数N.    接下来一行一个整数M,表示S中元素的数量.    接下来M行,每行一个数字串,表示S中的一个元素. 输出 输出一行一个整数,表示答案模109+7的值. 样例输入 20 3 2 3 14 样例输出 14 提示 下…
[SDOI2014]数数 题目描述: 我们称一个正整数N是幸运数,当且仅当它的十进制表示中不包含数字串集合S中任意一个元素作为其子串. 例如当S=(22,333,0233)时,233是幸运数,2333.20233.3223不是幸运数. 给定N和S,计算不大于N的幸运数个数. 输入格式: 输入的第一行包含整数N. 接下来一行一个整数M,表示S中元素的数量. 接下来M行,每行一个数字串,表示S中的一个元素. 输出格式: 输出一行一个整数,表示答案模\(10^{9}+7\)的值. 跟[JSOI2007…
题意:如果一个数中的某一段是长度大于2的菲波那契数,那么这个数就被定义为F数,前几个F数是13,21,34,55......将这些数字进行编号,a1 = 13, a2 = 21.现给定一个数n,输出和n相差最小的数ax与n的差值的绝对值,其中下标x满足是一个菲波那契数. 分析:该题所求真是九曲十八弯,说了那么多其实要解决的问题可以转化为给定一个x,求1-x之间有多少个F数,通过二分查找能够把下标是菲波那契数的序列求出来,之后就直接for循环找到那个最相近的数就可以了.关键是如何求解1-x之间有多…
l链接 这题想了好一会呢..刚开始想错了,以为用自动机预处理出k长度可以包含的合法的数的个数,然后再数位dp一下就行了,写到一半发现不对,还要处理当前走的时候是不是为合法的,这一点无法移到trie树上去判断. 之后想到应该在trie树上进行数位dp,走到第i个节点且长度为j的状态是确定的,所以可以根据trie树上的节点来进行确定状态. dp[i][j]表示当前节点为i,数第j位时可以包含多少个合法的数. #include <iostream> #include<cstdio> #i…
All submissions for this problem are available. Chef likes numbers and number theory, we all know that. There are N digit strings that he particularly likes. He likes them so much that he defines some numbers to be beautiful numbers based on these di…
题意:每位十进制数都能转化为4位二进制数,比如9是1001,127是 000100100111,现在问你,在L到R(R <= $10^{200}$)范围内,有多少数字的二进制表达式不包含模式串. 思路:显然这是一道很明显的数位DP + AC自动机的题目.但是你要是直接把数字转化为二进制,然后在Trie树上数位DP你会遇到一个问题,以为转化为二进制后,前导零变成了四位000,那么你在DP的时候还要考虑前4位是不是都是000那样就要重新跑Trie树,显然这样是很菜(不会)的.那么肯定是想办法要变成十…
Binary-coded decimal (BCD) is an encoding for decimal numbers in which each digit is represented by its own binary sequence. To encode a decimal number using the common BCD encoding, each decimal digit is stored in a 4-bit nibble: Decimal: 0 1 2 3 4…
BCD Code Time Limit: 5 Seconds      Memory Limit: 65536 KB Binary-coded decimal (BCD) is an encoding for decimal numbers in which each digit is represented by its own binary sequence. To encode a decimal number using the common BCD encoding, each dec…
题意: 问A到B之间的所有整数,转换成BCD Code后, 有多少个不包含属于给定病毒串集合的子串,A,B <=10^200,病毒串总长度<= 2000. BCD码这个在数字电路课上讲了,题干也讲的很详细. 数位DP的实现是通过0~9 ,并不是通过BCD码 所有我们需要先把字串放入AC自动机,建立一个BCD数组 因为BCD码是一个4位二进制数,但是tire图上全是0,1, 所以对于一个数字,我们的要在转移4次, 如果中间出现了病毒串就return -1 表示不能转移, BCD[i][j]表示在…
[BZOJ3530]数数(AC自动机,动态规划) 题面 BZOJ 题解 很套路的\(AC\)自动机+\(DP\) 首先,如果长度小于\(N\) 就不存在任何限制 直接大力\(DP\) 然后强制限制不能走到带有标记的点上面 如果长度恰好为\(N\)的长度 那么,要考虑是否恰好卡在范围里面 于是\(DP\)状态多记一维 表示是否卡在范围里面 最后求一下和就行啦 #include<iostream> #include<cstdio> #include<cstdlib> #in…
BZOJ_3209_花神的数论题_组合数+数位DP Description 背景 众所周知,花神多年来凭借无边的神力狂虐各大 OJ.OI.CF.TC …… 当然也包括 CH 啦. 描述 话说花神这天又来讲课了.课后照例有超级难的神题啦…… 我等蒟蒻又遭殃了. 花神的题目是这样的 设 sum(i) 表示 i 的二进制表示中 1 的个数.给出一个正整数 N ,花神要问你 派(Sum(i)),也就是 sum(1)—sum(N) 的乘积. Input 一个正整数 N. Output 一个数,答案模 10…
首先是描述个大概.不说一些特殊的DP 或者借用矩阵来状态转移 (这些本质都是一样的). 只讲AC自动机和DP的关系(个人理解). AC自动机 又可以叫做状态机. 我一开始的认为.AC 自动机提供了一些节点的信息.以及那些节点之间的关系.(节点也就是我们创建的 Trie图的节点.往往我们会有一维这个信息). 然后我们做DP的时候.就好像是 “顺着” AC自动机指导给我们的方向.然后做状态转移等等.这是一种感性的认识.     现在我认为.AC自动机本身就是一个大状态.同时父亲和孩子的关系给了我们D…
题目链接:BZOJ - 3530 题目分析 明显是 AC自动机+DP,外加数位统计. WZY 神犇出的良心省选题,然而去年我太弱..比现在还要弱得多.. 其实现在做这道题,我自己也没想出完整解法.. 就想出了个 O(l^3) 的做法: 完全按照数位统计的思想来,先统计长度不足 len 的数字的合法种类数,这个枚举开头,然后 AC 自动机 DP 一下,用 f[i][j] 表示到了第 i 位,在第 j 个节点上的合法数字个数.这样是 O(L^2). 然后长度等于 n 的部分,就按照数位统计,一位位向…
题目链接 蒟蒻今天终于学会了AC自动机,感觉很稳 (后一句愚人节快乐) 这题开一个f[i][j][k]表示有没有受到限制,正在枚举第j位,来到了AC自动机的第k个节点 的方案数 随后可以刷表更新 注意如果是在枚举第一位的话注意前导0 #include<cstdio> #include<algorithm> #include<cstring> #include<cctype> #include<cstdlib> #include<queue&…
题目传送门 题目大意:给你一个n-m的区间,问你这个闭区间内的特殊数有几个,特殊数的要求是 数的本身 和 各位数字之和  mod k 等于0. 思路:刚接触数位dp,看了网上的题解,说用dp[i][j][s]表示,总共有i位,数字本身mod k为j,各位数之和mod k为s的数量,然后状态转移方程是dp[i][(j+x)%k][(s*10+x)%k]+=dp[i][j][s],第一次看这方程感觉好有道理,然后看代码发现数位dp最重要的还是计数原理,过了好久才a了这道题.主要的思路放在代码注释里了…
点此看题面 大致题意: 求\(\sum_{x=0}^{a-1}\sum_{y=0}^{b-1}[(x\&y)<k]\). 数位\(DP\) 显然数位\(DP\)吧. 我们设\(f_{n,f1,f2,f3}\)表示当前处理到第\(n\)位,\(a\)是否卡在上界,\(b\)是否卡在上界,\(k\)是否卡在上界的方案数. 转移时枚举\(a\)和\(b\)这一位的填写状况,就能确定\(k\)这一位的填写状况了. 代码 #include<bits/stdc++.h> #define Tp…
思路:数位$DP$ 提交:5次(其实之前A过,但是调了调当初的程序.本次是2次AC的) 题解: 我们分别求出$sum(x)=i$,对于一个$i$,有几个$x$,然后我们就可以快速幂解决. 至于求个数用数位$DP$就好了. #include<cstdio> #include<iostream> #include<cstring> #define ull unsigned long long #define ll long long #define R register l…
题意:给定两个数,问区间[A,B]中0~9分别出现了多少次.A,B<=10^18 题解:应该是最裸的数位dp吧..一开始没有记忆化tle了TAT 我们可以求出区间[0,B]的,再减去区间[0,A]的. 用dfs实现,记录flag(填了的位是否和边界重合),zero(当前是否还在前缀0中) #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<…
难受啊,怎么又遇到我不会的题了(捂脸) 如题,这是一道数位DP,随便找了个博客居然就是我们大YZ的……果然nb,然后就是改改模版++注释就好的了,直接看注释吧,就是用1~B - 1~A-1而已,枚举全部位然后判一下是不是上限边缘和前导零就OK #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long LL; LL bit[]; ]; LL ]…
传送门 如果\(r-l\)比较小,可以将所有满足条件的串扔进\(AC\)自动机然后在上面DP,从前往后确定字符串的每一位. 但是\(l,r \leq 10^{800}\)就十分不可行,所以需要优化这个算法. 考虑可能会有某一个节点的子节点连向的所有子节点构成一个满十叉树,意即当到达了这个节点之后可以随便往下走子节点,而且不论怎么走得到的结果都相同.比如说对于某一个九位数\(x = \overline {x_1x_2x_3x_4x_5x_6x_7x_8x_9}\),当前的\(l=123456789…
题意 题目给出m(m<=10)个仅仅由A,T,C,G组成的单词(单词长度不超过10),然后给出一个整数n(n<=2000000000),问你用这四个字母组成一个长度为n的长文本,有多少种组成方法可以使得它不含任何一个给出的单词. 分析 当时一看以为是跟训练指南上(UVA11468)一样的题,感觉只有四个字母并且单词数量和长度也比较小,但是一看给出的n有点懵逼.如果再按照书上建立AC自动机以后直接跑DP的方法肯定是不行了.然后我们就要用到,递推利器,矩阵快速幂. 我们还是按照套路先把AC自动机建…
Foj 2299 Prefix 题意 给定串s.正整数n,问有多少长度为n的字符串t满足:s[0...i]是t的子串,s[0...i+1]不是. 题解 求有多少长度为n的字符串t满足:s[0...i]是t的子串 这样求出来的数列就是答案的一个前缀和. 具体求法可以对于s[0...i]建一个AC自动机,列出dp式子,状态转移矩阵就很好构造了. 现场主要是没想到每个前缀的方案数要分开求. 代码 #include<cstdio> #include<cmath> #include<v…
http://acm.hdu.edu.cn/showproblem.php?pid=5955 题意:给你长度为l的n组数,每个数1-6,每次扔色子,问你每个串第一次被匹配的概率是多少 题解:先建成ac自动机构造fail数组,然后因为fail指针可能向前转移所以不能不能直接递推dp,需要高斯消元解方程,对于节点i,假设不是结束点而且能转移到它的点有a1,a2...an,那么dp[i]=1/6*dp[a1]+1/6*dp[a2]+...+1/6*a[n],然后我们可以列出n个方程,高斯消元然后找到每…