「SDOI2014」数数 解题报告
「SDOI2014」数数
题目描述
我们称一个正整数 \(N\) 是幸运数,当且仅当它的十进制表示中不包含数字串集合 \(S\) 中任意一个元素作为其子串。
例如当 \(S=(\)22, 333, 0233\()\) 时,233 是幸运数,2333、20233、3223 不是幸运数。
给定 \(N\) 和 \(S\),计算不大于 \(N\) 的幸运数个数。
输入格式
输入的第一行包含整数 \(N\)。
接下来一行一个整数 \(M\),表示 \(S\) 中元素的数量。 接下来 \(M\) 行,每行一个数字串,表示 \(S\) 中的一个元素。
输出格式
输出一行一个整数,表示答案模 \(10^9+7\) 的值。
数据范围与提示
我们以 \(l\) 表示 \(N\) 的长度,\(L\) 表示 \(S\) 中所有串长度之和。
对于所有数据,\(1 \leq l \leq 1200 ,\ 1 \leq M \leq 100 ,\ 1 \leq L \leq 1500\)。
关于多子串的东西可以想到AC自动机,可以在上面dp。
\(dp_{i,j,0/1}\)代表\(i\sim n\)位数字目前在AC自动机上匹配到节点\(j\)是否有最高位限制。
最后一位可以像数位dp那样非常简单的转移,有个坑点是\(S\)中有前导\(0\),但是\(N\)中没有。
有一种简单的处理方法是在建完AC自动机后把边\(ch[root][0]\)删掉
Code:
#include <cstdio>
#include <cstring>
const int mod=1e9+7;
const int N=1520;
inline void add(int &x,int y){x=x+y>=mod?x+y-mod:x+y;}
char s[N],t[N];
int ch[N][10],endro[N],fail[N],tot,q[N],l=1,r,bit[N],dp[N][N][2];
void ins()
{
scanf("%s",s+1);
int n=strlen(s+1),now=0;
for(int i=1;i<=n;i++)
{
if(!ch[now][s[i]-'0']) ch[now][s[i]-'0']=++tot;
now=ch[now][s[i]-'0'];
}
endro[now]=1;
}
void build()
{
for(int i=0;i<10;i++)
if(ch[0][i])
q[++r]=ch[0][i];
while(l<=r)
{
int now=q[l++];
for(int i=0;i<10;i++)
{
if(ch[now][i]) fail[q[++r]=ch[now][i]]=ch[fail[now]][i];
else ch[now][i]=ch[fail[now]][i];
}
}
ch[0][0]=0;
}
int main()
{
scanf("%s",t+1);
int n=strlen(t+1),m;
for(int i=1;i<=n;i++) bit[i]=t[n+1-i]-'0';
scanf("%d",&m);
for(int i=1;i<=m;i++) ins();
build();
dp[n+1][0][1]=1;
for(int i=n+1;i>1;i--)
for(int j=0;j<=tot;j++)
for(int l=0;l<=1;l++)
for(int k=0,u=l?bit[i-1]:9;k<=u;k++)
{
int to=ch[j][k];
if(!endro[to]) add(dp[i-1][to][l&k==bit[i-1]],dp[i][j][l]);
}
int ans=mod-1;
for(int i=0;i<=tot;i++) add(ans,dp[1][i][0]),add(ans,dp[1][i][1]);
printf("%d\n",ans);
return 0;
}
2019.2.21
「SDOI2014」数数 解题报告的更多相关文章
- 「SDOI2014」向量集 解题报告
「SDOI2014」向量集 维护一个向量集合,在线支持以下操作: A x y :加入向量 \((x, y)\): Q x y l r:询问第 \(L\) 个到第 \(R\) 个加入的向量与向量 \(( ...
- 「NOI2015」寿司晚宴 解题报告
「NOI2015」寿司晚宴 这个题思路其实挺自然的,但是我太傻了...最开始想着钦定一些,结果发现假了.. 首先一个比较套路的事情是状压前8个质数,后面的只会在一个数出现一次的再想办法就好. 然后发现 ...
- 「ZJOI2016」大森林 解题报告
「ZJOI2016」大森林 神仙题... 很显然线段树搞不了 考虑离线操作 我们只搞一颗树,从位置1一直往后移动,然后维护它的形态试试 显然操作0,1都可以拆成差分的形式,就是加入和删除 因为保证了操 ...
- 「SCOI2016」背单词 解题报告
「SCOI2016」背单词 出题人sb 题意有毒 大概是告诉你,你给一堆n个单词安排顺序 如果当前位置为x 当前单词的后缀没在这堆单词出现过,代价x 这里的后缀是原意,但不算自己,举个例子比如abc的 ...
- 「SCOI2015」国旗计划 解题报告
「SCOI2015」国旗计划 蛮有趣的一个题 注意到区间互不交错,那么如果我们已经钦定了一个区间,它选择的下一个区间是唯一的,就是和它有交且右端点在最右边的,这个可以单调队列预处理一下 然后往后面跳拿 ...
- 「JLOI2015」骗我呢 解题报告?
「JLOI2015」骗我呢 这什么神仙题 \[\color{purple}{Link}\] 可以学到的东西 对越过直线的东西翻折进行容斥 之类的..吧? Code: #include <cstd ...
- 「JLOI2015」城池攻占 解题报告
「JLOI2015」城池攻占 注意到任意两个人的战斗力相对大小的不变的 可以离线的把所有人赛到初始点的堆里 然后做启发式合并就可以了 Code: #include <cstdio> #in ...
- 「JLOI2015」管道连接 解题报告
「JLOI2015」管道连接 先按照斯坦纳树求一个 然后合并成斯坦纳森林 直接枚举树的集合再dp一下就好了 Code: #include <cstdio> #include <cct ...
- 「JLOI2015」战争调度 解题报告
「JLOI2015」战争调度 感觉一到晚上大脑就宕机了... 题目本身不难,就算没接触过想想也是可以想到的 这个满二叉树的深度很浅啊,每个点只会和它的\(n-1\)个祖先匹配啊 于是可以暴力枚举祖先链 ...
- 「SHOI2014」三叉神经树 解题报告
「SHOI2014」三叉神经树 膜拜神仙思路 我们想做一个类似于动态dp的东西,首先得确保我们的运算有一个交换律,这样我们可以把一长串的运算转换成一块一块的放到矩阵上之类的东西,然后拿数据结构维护. ...
随机推荐
- Linux查看和注销用户(User)
Linux如何注销其他用户?_Linux教程_Linux公社-Linux系统门户网站https://www.linuxidc.com/Linux/2012-07/64939.htm linux注销指定 ...
- JS XMLHttpRequesst对象 http post的五种请求状态
记录一下js中对http请求的几种状态,下附代码 readyState 存有 XMLHttpRequest 的状态.从 0 到 4 发生变化. 0: 请求未初始化 1: 服务器连接已建立 2: 请求已 ...
- C\C++学习笔记 3
C++记录7 函数指针: 函数名为地址, 地址指的是在机器指令存储的地址. double func(int line){ reture line*3.5;} void f(int line, doub ...
- Azure系列1.1.2 —— 用于 IntelliJ 的 Azure 工具包的登录说明
(文中大部分内容(95%)Azure官网上有,我只是把我自己实际操作中遇到的问题在这里阐述一下.) 先决条件 若要完成文章中的步骤,需要安装用于 IntelliJ 的 Azure 工具包,该工具包需要 ...
- python学习笔记(6)--条件分支语句
if xxxx: coding if xxxx: coding else: coding if xxxx: coding elif xxx: coding …… else: coding 或者一种简洁 ...
- Helm
helm类似yum helm下载的是配置清单文件 核心术语: Chart:一个helm程序包: Repository:Charts仓库,https/http服务器: Release:特定的Chart部 ...
- static关键字的用法
静态变量和静态方法 static关键字的基本用法: 1.修饰变量:被static修饰的变量属于类变量,可以用类名.变量名来引用,而不用直接new一个对象来引用. 2.修饰方法:被static修饰的方法 ...
- JavaScript之简易http接口测试工具网页版
简易http接口测试工具网页版,支持get.post请求,支持json格式消息体,form表单暂不支持. httpClient.html <!DOCTYPE html> <html ...
- struts2 的struts.xml配置文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-/ ...
- luogu2258
题面 sol:先爆搜搜出r行,再在那r行中选c列DP得到最优解 我太菜了,这种题都做了好久,还需锻炼码力啊qwq #include <cstdio> #include <cstrin ...