[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 ...
随机推荐
- XML文件详解以及解析
转自:https://blog.csdn.net/com_ma/article/details/73277535 一.xml基础详解: 1.概述: xml:即可扩展标记语言,xml是互联网数据传输的重 ...
- Visual Studio 各版本下载
http://baike.baidu.com/link?url=guN2bFtq-TvtdH-iDSiYFDJ-HF8R4_12qz6QRjxKxP2Nz8jK0p70KlmudolZOg-C3umq ...
- 网站程序CMS识别
CMS cms一般有dedecms(织梦),dzcms,phpweb,phpwind,phpcms,ecshop,dvbbs,siteweaver,aspcms,帝国,zblog,wordpress等 ...
- Postfix 邮件服务 - roundcube webmail
roundcubemail作为web端的邮件客户端.是一个基于浏览器,支持多国语言的IMAP客户端,它的操作界面看起像一个桌面应用程序.它提供一个email客户端应该具备的所有功能,包括MIME支 ...
- nxlog 日志采集
Nxlog 主要用于各业务后端服务的日志采集,windows环境和linux环境都支持. RPM 包:rpm -ivh http://nxlog.co/system/files/products/fi ...
- 如何在同一台服务器上部署两个tomcat
因为测试的需要,有时我们必须在同一个服务器上部署两个tomcat,然后去做应用的部署,那么很多同学可能会觉得比较为难,找的资料也比较的不齐全,那么今天华华就来给大家讲讲如何部署2个tomcat,并能够 ...
- python - str和repr方法:
# python 内置__str__()和__repr__()方法: #显示自定制 # 示例1 # a = 123 # print(a.__str__()) # 示例2 class Test(): d ...
- Dubbo多版本
当服务提供者提供的服务接口出现不兼容升级时,可以设置版本号,使用多个版本号(version)进行过渡. 1).服务提供者配置文件 <dubbo:service ref="userSer ...
- 子元素应该margin-top为何会影响父元素【转】
这个问题困惑了很久,虽然没有大碍早就摸出来怎么搞定它,但始终不明白原因出在哪里,如果只是IE有问题我也不会太在意,可问题是所有上等浏览器都表现如此,这样叫我怎能安心?今天总算下狠心查出来怎么回事,居然 ...
- python3之Django多数据库
1.定义数据库 在django项目中, 一个工程中存在多个APP应用很常见:有时候希望不同的APP连接不同的数据库,这个时候需要建立多个数据库连接.在Django的setting中使用DATABASE ...