[BZOJ 3530][Sdoi 2014]数数
阿拉~好像最近总是做到 AC 自动机的题目呢喵~
题目的算法似乎马上就能猜到的样子…… AC 自动机 + 数位 dp
先暴力转移出 f[i][j] :表示从 AC 自动机上第 j 号节点走 i 步且不碰到匹配串的方案数
然后直接用数位 dp 一位一位的试就可以了,大家都会吧~
但是…… 有前导 0 的情况真尼玛蛋疼啊!
忽的灵光一闪……
前导 0 仅能影响长度小于 L 的数的统计
那么所有长度 <L 的数全部专门暴力统计一边不就可以了!我真是特么太机智了喵~ O(∩_∩)O~
虽然有个 O(10*L*l) 的转移 但是只跑了 272 ms 呢
#include <cstdio>
#include <cstring>
#define ord(ch) ((ch)-'0')
const int sizeOfLength=;
const int sizeOfNumber=;
const int sizeOfType=;
const int mod=; struct node
{
int idx;
bool end;
node * fail, * ch[sizeOfType];
};
node * dfa;
node memory[sizeOfNumber], * port=memory;
inline node * newnode();
inline void insert(char * , int);
node * q[sizeOfNumber]; int l, r;
inline void build();
inline void dynamicprogramming(); char N[sizeOfLength]; int L;
int M;
int f[sizeOfLength][sizeOfNumber];
char s[sizeOfNumber]; int len;
inline int getint();
inline int getstr(char * );
inline void putint(int); int main()
{
int ans=;
bool find=true;
node * t; L=getstr(N);
M=getint();
dfa=newnode();
for (int i=;i<=M;i++)
{
len=getstr(s);
insert(s, len);
}
build();
dynamicprogramming(); t=dfa;
for (int i=;i<L;i++)
{
for (int j=(i==);j<ord(N[i]);j++) if (!t->ch[j]->end)
ans=(ans+f[L-i-][t->ch[j]->idx])%mod;
t=t->ch[ord(N[i])];
if (t->end)
{
find=false;
break;
}
}
for (int i=L-;i>=;i--)
for (int j=;j<=;j++)
ans=(ans+f[i][dfa->ch[j]->idx])%mod; putint(ans+find); return ;
}
inline int getint()
{
register int num=;
register char ch;
do ch=getchar(); while (ch<'' || ch>'');
do num=num*+ch-'', ch=getchar(); while (ch>='' && ch<='');
return num;
}
inline int getstr(char * str)
{
register int len=;
register char ch;
do ch=getchar(); while (ch<'' || ch>'');
do str[len++]=ch, ch=getchar(); while (ch>='' && ch<='');
return len;
}
inline void putint(int num)
{
char stack[];
register int top=;
for ( ;num;num/=) stack[++top]=num%+'';
for ( ;top;top--) putchar(stack[top]);
putchar('\n');
}
inline node * newnode()
{
node * ret=port++;
ret->idx=port-memory-;
ret->fail=NULL;
memset(ret->ch, , sizeof ret->ch);
return ret;
}
inline void insert(char * s, int l)
{
node * t=dfa;
for (int i=;i<l;i++)
{
if (!t->ch[ord(s[i])]) t->ch[ord(s[i])]=newnode();
t=t->ch[ord(s[i])];
}
t->end=true;
}
inline void build()
{
dfa->fail=dfa;
for (int i=;i<sizeOfType;i++)
if (dfa->ch[i])
{
dfa->ch[i]->fail=dfa;
q[r++]=dfa->ch[i];
}
else
dfa->ch[i]=dfa;
for ( ;l<r;l++)
{
node * u=q[l];
u->end|=u->fail->end;
for (int i=;i<sizeOfType;i++)
if (u->ch[i])
{
u->ch[i]->fail=u->fail->ch[i];
q[r++]=u->ch[i];
}
else
u->ch[i]=u->fail->ch[i];
}
}
inline void dynamicprogramming()
{
int tot=port-memory;
for (int i=;i<tot;i++)
if (!(dfa+i)->end)
f[][(dfa+i)->idx]=;
for (int i=;i<=L;i++)
for (int j=;j<tot;j++) if (!(dfa+j)->end)
for (int k=;k<sizeOfType;k++)
f[i][(dfa+j)->idx]=(f[i][(dfa+j)->idx]+f[i-][(dfa+j)->ch[k]->idx])%mod;
}
机房不卡代码插入了 好评如潮
[BZOJ 3530][Sdoi 2014]数数的更多相关文章
- 【BZOJ 3530】【SDOI 2014】数数
http://www.lydsy.com/JudgeOnline/problem.php?id=3530 上午gty的测试题,爆0了qwq 类似文本生成器那道题,把AC自动机的转移建出来,准确地说建出 ...
- BZOJ 3533 sdoi 2014 向量集
设(x,y)为Q的查询点,分类讨论如下:1.y>0: 最大化a*x+b*y,维护一个上凸壳三分即可 2.y<0:最大化a*x+b*y 维护一个下凸壳三分即可 我们考虑对时间建出一棵线段 ...
- 【BZOJ】【3530】【SDOI2014】数数
AC自动机/数位DP orz zyf 好题啊= =同时加深了我对AC自动机(这个应该可以叫Trie图了吧……出边补全!)和数位DP的理解……不过不能自己写出来还真是弱…… /************* ...
- BZOJ 3530: [Sdoi2014]数数 [AC自动机 数位DP]
3530: [Sdoi2014]数数 题意:\(\le N\)的不含模式串的数字有多少个,\(n=|N| \le 1200\) 考虑数位DP 对于长度\(\le n\)的,普通套路DP\(g[i][j ...
- [BZOJ 3530] [Sdoi2014] 数数 【AC自动机+DP】
题目链接:BZOJ - 3530 题目分析 明显是 AC自动机+DP,外加数位统计. WZY 神犇出的良心省选题,然而去年我太弱..比现在还要弱得多.. 其实现在做这道题,我自己也没想出完整解法.. ...
- bzoj 3530: [Sdoi2014]数数 数位dp
题目 我们称一个正整数N是幸运数,当且仅当它的十进制表示中不包含数字串集合S中任意一个元素作为其子串.例如当S=(22,333,0233)时,233是幸运数,2333.20233.3223不是幸运数. ...
- 3530: [Sdoi2014]数数
3530: [Sdoi2014]数数 链接 分析: 对给定的串建立AC自动机,然后数位dp.数位dp的过程中,记录当前在AC自动机的哪个点上,保证不能走到出现了给定串的点. 代码: #include& ...
- [BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛)
[BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛) 题面 我们知道,从区间\([L,R]\)(L和R为整数)中选取N个整数,总共有\((R-L+1)^N\)种方案.求最大公约数 ...
- 【BZOJ 3326】[Scoi2013]数数
题目描述 Fish 是一条生活在海里的鱼,有一天他很无聊,就开始数数玩.他数数玩的具体规则是: 确定数数的进制B 确定一个数数的区间[L, R] 对于[L, R] 间的每一个数,把该数视为一个字符串, ...
随机推荐
- 物联网安全拔“牙”实战——低功耗蓝牙(BLE)初探
物联网安全拔“牙”实战——低功耗蓝牙(BLE)初探 唐朝实验室 · 2015/10/30 10:22 Author: FengGou 0x00 目录 0x00 目录 0x01 前言 0x02 BLE概 ...
- python 中date datetime time 与str的互转
以下全部引入 form datetime import datetime, timedelta import time 一.time 转str 二.datetime 转 str str_date = ...
- Openfire开发配置,Openfire源代码配置,OpenFire二次开发配置
原文:http://www.cnblogs.com/lixiaolun/archive/2013/12/07/3462780.html 1.下载源代码:http://www.igniterealtim ...
- mybatis-config.xml简单笔记
mybatis-config.xml简单笔记 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ...
- svn查看代码作者的命令
svn blame **.java | grep ** svn查看代码作者的命令
- node.js基础 1之基本概念常识
node.js 好牛逼的样子哦 很火,很腻害~~~~ 有关node.js的版本常识: 一般用最新的稳定版本,非稳定版本用于测试,其中包括api的不稳定等. 起一个web服务器: ndoejs可以自定义 ...
- svn用法:摘自http://wh-vip-126-com200907043220.iteye.com/blog/424642
下载最新版本svn(http://www.visualsvn.com/server/ ) 1.安装SVN 2.创建user与repository 3.Eclipse下配置SVN插件 3.1帮助- ...
- apache认证、授权、访问控制
认证对象:某一个网站目录. 启用认证 1.即用AllowOverride指令指定哪些指令在针对单个目录的配置文件中有效:AllowOverride AuthConfig 2.设置密码登录访问某个站点或 ...
- 为什么使用 Bootstrap?
为什么使用 Bootstrap? 移动设备优先:自 Bootstrap 3 起,框架包含了贯穿于整个库的移动设备优先的样式. 浏览器支持:所有的主流浏览器都支持 Bootstrap. 容易上 ...
- 内存管理单元(MMU)和协处理器CP15介绍(转)
内存管理单元(MMU)和协处理器CP15介绍内存管理单元(MMU)介绍嵌入式系统中,存储系统差别很大,可包含多种类型的存储器件,如FLASH,SRAM,SDRAM,ROM等,这些不同类型的存储器件速度 ...