[SDOI2014]数数
题解:
做过ac自动机上dp的这题应该就很容易想到了
首先在ac自动机上搞dp
表示当前考虑了i位,在自动机的j位上
然后转移就可以了
考虑限制
显然是一个数位dp
考虑位数小于n显然满足要求
考虑位数等于n
令f[i][j][0/1]表示前i位,自动机j上,与限制是否重合 然后枚举转移就行了
另外就是对于位数比它少的再做一次(否则的话有前导零可能会让答案变小)
代码:
#include <bits/stdc++.h>
using namespace std;
#define N 2000
#define mo 1000000007
char cc[N];
int x1[N],x2[N],c[][],val[],fail[];
int dp[][][],cnt;
bool tt=;
void insert(char *cc)
{
int len=strlen(cc),now=;
for (int i=;i<len;i++)
{
int v=cc[i]-'';
if (!c[now][v]) c[now][v]=++cnt;
now=c[now][v];
}
val[now]=;
}
queue<int> q;
void build()
{
for (int i=;i<=;i++)
if (c[][i]) fail[c[][i]]=,q.push(c[][i]);
while (!q.empty())
{
int u=q.front(); q.pop();
for (int i=;i<=;i++)
{
if (c[u][i])
{
fail[c[u][i]]=c[fail[u]][i];
q.push(c[u][i]);
} else c[u][i]=c[fail[u]][i];
val[c[u][i]]|=val[c[fail[u]][i]];
}
}
}
void plus2(int &x,int y)
{
x+=y;
x=x%mo;
}
bool pd(int x,int y)
{
if(x==&&y==) return(false);
else return(true);
}
int main()
{
freopen("noi.in","r",stdin);
freopen("noi.out","w",stdout);
std::ios::sync_with_stdio(false);
cin>>cc;
int n,m,len=strlen(cc);
n=len;
for (int i=;i<len;i++)
x1[i]=cc[i]-'';
cin>>m;
for (int i=;i<=m;i++)
{
cin>>cc;
insert(cc);
}
build();
dp[][][]=;
for (int i=;i<=n-;i++)
for (int j=;j<=cnt;j++)
// if (dp[i][j])
{
for (int k=;k<=;k++)
if (!val[c[j][k]]&&(pd(i,k)))
plus2(dp[i+][c[j][k]][],dp[i][j][]);
for (int k=;k<=x1[i]-;k++)
if (!val[c[j][k]]&&(pd(i,k)))
plus2(dp[i+][c[j][k]][],dp[i][j][]);
if (!val[c[j][x1[i]]])
plus2(dp[i+][c[j][x1[i]]][],dp[i][j][]);
}
int ans=;
for (int i=;i<=cnt;i++)
plus2(ans,dp[n][i][]),plus2(ans,dp[n][i][]);
memset(dp,,sizeof(dp));
dp[][][]=;
for (int i=;i<=n-;i++)
for (int j=;j<=cnt;j++)
{
for (int k=;k<=;k++)
if (!val[c[j][k]]&&(pd(i,k)))
plus2(dp[i+][c[j][k]][],dp[i][j][]);
}
for (int i=;i<=n-;i++)
for (int j=;j<=cnt;j++)
plus2(ans,dp[i][j][]);
cout<<ans;
return ;
}
[SDOI2014]数数的更多相关文章
- 【BZOJ】【3530】【SDOI2014】数数
AC自动机/数位DP orz zyf 好题啊= =同时加深了我对AC自动机(这个应该可以叫Trie图了吧……出边补全!)和数位DP的理解……不过不能自己写出来还真是弱…… /************* ...
- BZOJ3530: [Sdoi2014]数数
3530: [Sdoi2014]数数 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 322 Solved: 188[Submit][Status] ...
- 【HDU3530】 [Sdoi2014]数数 (AC自动机+数位DP)
3530: [Sdoi2014]数数 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 682 Solved: 364 Description 我们称一 ...
- BZOJ 3530: [Sdoi2014]数数 [AC自动机 数位DP]
3530: [Sdoi2014]数数 题意:\(\le N\)的不含模式串的数字有多少个,\(n=|N| \le 1200\) 考虑数位DP 对于长度\(\le n\)的,普通套路DP\(g[i][j ...
- 「SDOI2014」数数 解题报告
「SDOI2014」数数 题目描述 我们称一个正整数 \(N\) 是幸运数,当且仅当它的十进制表示中不包含数字串集合 \(S\) 中任意一个元素作为其子串. 例如当 \(S=(\)22, 333, 0 ...
- 3530: [Sdoi2014]数数
3530: [Sdoi2014]数数 链接 分析: 对给定的串建立AC自动机,然后数位dp.数位dp的过程中,记录当前在AC自动机的哪个点上,保证不能走到出现了给定串的点. 代码: #include& ...
- [SDOI2014]数数 --- AC自动机 + 数位DP
[SDOI2014]数数 题目描述: 我们称一个正整数N是幸运数,当且仅当它的十进制表示中不包含数字串集合S中任意一个元素作为其子串. 例如当S=(22,333,0233)时,233是幸运数,2333 ...
- bzoj [Sdoi2014]数数 AC自动机上dp
[Sdoi2014]数数 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1264 Solved: 636[Submit][Status][Discu ...
- [Sdoi2014]数数[数位dp+AC自动机]
3530: [Sdoi2014]数数 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 834 Solved: 434[Submit][Status][ ...
- [bzoj3530][Sdoi2014]数数_AC自动机_数位dp
数数 bzoj-3530 Sdoi-2014 题目大意:给你一个整数集合,求所有不超过n的正整数,是的它的十进制表示下不能再一段等于集合中的任意数. 注释:$1\le n \le 1200$,$1\l ...
随机推荐
- bzoj千题计划305:bzoj2565: 最长双回文串(回文自动机)
https://www.lydsy.com/JudgeOnline/problem.php?id=2565 正着构造回文自动机 倒过来再构造一个回文自动机 分别求出以位置i开始的和结尾的最长回文串 # ...
- Shell编程(一)概览
1. Shell功能 1. 自动化批量系统初始化程序(update.软件安装.时区设置.安全策略.......) 2. 自动化批量软件部署程序(LAMP.LNMP.Tomcat.LVS.Nginx) ...
- android measure的时候报空指针
1.使用listview的时候,在代码中动态设置其高度,在android低版本中,这个低版本是以4.4为界,会报measure的空指针,原因是低版本relativelayout有个bug,使用list ...
- luogu 1052 过河
神仙的博客,先copy了日后绝对删掉的,(因为我实在没耐心看懂啊..) 题解 step 1理解题意 在做这道题之前,一定要理解好题意,有一个需要特别注意注意的地方: 青蛙不是一定要跳到石头上[嗯... ...
- js计算数字长度
js调用toString方法转为字符串后取长度 var num = 123; alert(num.toString().length);
- Java SE之浅谈JDK SDK JRE
JDK(Java Development Kit): 1.定义:编写Java程序的程序员使用的软件开发工具包,又被称为Java SDK (Java Software Development Kit ...
- mongodb系列~ mongodb慢语句(3)
简介: 关于mongodb慢日志是如何收集 一 mongodb慢日志的开启 1 直接设置参数,不重启服务:db.setProfilingLevel(1) 2 添加启动参数,重启服务:添加profile ...
- Maven继承
继承为了消除重复,可以把pom 中很多相同的配置提取出来:如:grouptId, version 等. 在使用的时候子工程直接继承父工程的依赖版本号,子工程中不再需要指定具体版本号,方便统一管控项目的 ...
- Principal components analysis(PCA):主元分析
在因子分析(Factor analysis)中,介绍了一种降维概率模型,用EM算法(EM算法原理详解)估计参数.在这里讨论另外一种降维方法:主元分析法(PCA),这种算法更加直接,只需要进行特征向量的 ...
- 【黑客免杀攻防】读书笔记7 - 软件逆向工程基础1(函数调用约定、Main函数查找)
0x1 准备工作 1.1.准备工具 IDA:交互式反汇编工具 OllyDbg:用户层调试工具 Visual Studio:微软开发工具 1.2.基础知识 C++开发 汇编语言 0x2 查找真正的mai ...