P3311-[SDOI2014]数数【AC自动机,dp】
正题
题目链接:https://www.luogu.com.cn/problem/P3311
题目大意
求一个不超过nnn的数字使其不包含任何sss集合中的数字串。
解题思路
很经典的ACACAC自动机上面dpdpdp,但是因为是数字所以要来点数位dpdpdp的东西,多开一维用0/10/10/1表示是否在上界,然后每次要加入一些新的值以确保没有前导000。
时间复杂度O(n∑i=1m∣si∣)O(n\sum_{i=1}^m|s_i|)O(n∑i=1m∣si∣)
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int N=2100,P=1e9+7;
int m,cnt,siz[N],fail[N],ch[N][10],f[2][N][2];
char n[N],s[N];queue<int> q;
void Insert(char *s){int l=strlen(s),x=0;for(int i=0;i<l;i++){int c=s[i]-'0';if(!ch[x][c])ch[x][c]=++cnt;x=ch[x][c];}siz[x]++;
}
void Get_Fail(){for(int i=0;i<10;i++)if(ch[0][i])q.push(ch[0][i]);while(!q.empty()){int x=q.front();q.pop();for(int i=0;i<10;i++){if(!ch[x][i])ch[x][i]=ch[fail[x]][i];else{fail[ch[x][i]]=ch[fail[x]][i];q.push(ch[x][i]);}}}return;
}
int main()
{scanf("%s",n+1);int l=strlen(n+1);scanf("%d",&m);for(int i=1;i<=m;i++){scanf("%s",s);Insert(s);}Get_Fail();int ans=0;for(int i=1;i<=l;i++){memset(f[i&1],0,sizeof(f[i&1]));int lim=n[i]-'0';if(i==1){for(int k=1;k<lim;k++)(f[i&1][ch[0][k]][0]+=1)%=P;(f[i&1][ch[0][lim]][1]+=1)%=P;}elsefor(int k=1;k<10;k++)(f[i&1][ch[0][k]][0]+=1)%=P;for(int j=0;j<=cnt;j++){if(siz[j])continue;for(int k=0;k<10;k++)(f[i&1][ch[j][k]][0]+=f[~i&1][j][0])%=P;for(int k=0;k<lim;k++)(f[i&1][ch[j][k]][0]+=f[~i&1][j][1])%=P;(f[i&1][ch[j][lim]][1]+=f[~i&1][j][1])%=P;}}for(int i=0;i<=cnt;i++)if(!siz[i])(ans+=(f[l&1][i][0]+f[l&1][i][1])%P)%=P;printf("%d\n",ans);
}
P3311-[SDOI2014]数数【AC自动机,dp】相关推荐
- 【BZOJ3530】数数(AC自动机,动态规划)
[BZOJ3530]数数(AC自动机,动态规划) 题面 BZOJ 题解 很套路的\(AC\)自动机+\(DP\) 首先,如果长度小于\(N\) 就不存在任何限制 直接大力\(DP\) 然后强制限制不能 ...
- 【BZOJ】4861: [Beijing2017]魔法咒语 AC自动机+DP+矩阵快速幂
[题意]给定n个原串和m个禁忌串,要求用原串集合能拼出的不含禁忌串且长度为L的串的数量.(60%)n,m<=50,L<=100.(40%)原串长度为1或2,L<=10^18. [算法 ...
- uvalive4842(AC自动机+DP)
题意: 给出猴子打字时打某个字母的概率,猴子最多可以敲键盘m次,问得到的长度是m的单词包含模式串的概率. 思路: AC自动机+dp. 首先,我们用模式串构造一个AC自动机,用dp[i]][j]表示当前 ...
- HDU 2296 Ring AC自动机 + DP
题意:给你n个模式串,每个模式串有一个得分,让你构造出一个长度为N之内且分数最高的文本串;输出字典序列最小的. 解题思路: AC自动机 + DP , 不过要输出字典序列最小,多开一个 一个三维字符串 ...
- bzoj 1030: [JSOI2007]文本生成器(AC自动机+DP)
1030: [JSOI2007]文本生成器 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 5187 Solved: 2136 [Submit][St ...
- 【HDU3530】 [Sdoi2014]数数 (AC自动机+数位DP)
3530: [Sdoi2014]数数 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 682 Solved: 364 Description 我们称 ...
- [BZOJ1030]:[JSOI2007]文本生成器(AC自动机+DP)
题目传送门 题目描述: JSOI交给队员ZYX一个任务,编制一个称之为"文本生成器"的电脑软件:该软件的使用者是一些低幼人群, 他们现在使用的是GW文本生成器v6版.该软件可以随机 ...
- Codeforces 1015F Bracket Substring AC自动机 + dp
Bracket Substring 这么垃圾的题怎么以前都不会写啊, 现在一眼怎么就会啊.... 考虑dp[ i ][ j ][ k ][ op ] 表示 已经填了 i 个空格, 末尾串匹配到 所给串 ...
- 牛客 - Connie(AC自动机+dp/KMP+dp)
题目链接:点击查看 题目大意:给出一个匹配串 sss,现在问模式串 ttt 的期望得分.其中假设匹配串在模式串中的出现次数为 xxx,那么将得到 2x2^x2x 的分数 题目分析:涉及到了期望一开始还 ...
最新文章
- 在Google Android模拟器中使用SD卡(命令行和eclipse环境)
- Atitit. 软件GUIbutton与仪表盘--webserver区--获取apache配置文件路径 linux and apache的启动、停止、重新启动...
- 目录config.php怎么修改域名,config.php · wlphp/基于宝塔面板api给站点新增删除域名接口 - Gitee.com...
- 没有可用于当前位置的源代码
- 在c++中使用gotoxy
- SpringCloud 微服务
- Android 获取设备ID,手机厂商,运营商,联网方式,获取系统语言,获取时区
- MySQL安装之后没有MySQL数据库的原因
- Repeater内部排序
- 转帖一则——从医学角度论成熟
- 关于浏览器中copy, cut, paste捕获的总结
- win10 桌面背景最短切换时间由1分钟改为10秒
- 尼康1c全站仪语言设置,尼康NIVO.1C全站仪
- Google永久允许使用Flash 100%详细简单+解决
- 电子手表,硬核拆解,内部结构
- QTableWidget 数据添加与表头设置
- word尾注编辑参考文献
- 导出数据提示--secure-file-priv选项问题的解决方法
- 物联网-位置信息、定位技术与位置服务
- 计算机网络设备安装调试,网络设备安装与调试
热门文章
- c语言逆序数输三个数,C语言求助!一个三位数的逆序数,总是编不对
- linux lua socket编程,CentOs 安装lua,luasocket
- python训练词库_在Python中训练NGramModel
- 在c语言程序中将数据分为两种,2012年计算机二级C语言考点归纳汇总(一至四章)...
- mybatis plus 批量保存_mybatis源码分析
- 算法设计与分析——递归与分治策略——全排列
- Excel学习使用教程
- 数据结构——从叶子结点到根节点的全部路径
- 数据结构——二叉树的最长路径问题
- java并发练习之快乐影院