阿拉~好像最近总是做到 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]数数的更多相关文章

  1. 【BZOJ 3530】【SDOI 2014】数数

    http://www.lydsy.com/JudgeOnline/problem.php?id=3530 上午gty的测试题,爆0了qwq 类似文本生成器那道题,把AC自动机的转移建出来,准确地说建出 ...

  2. BZOJ 3533 sdoi 2014 向量集

    设(x,y)为Q的查询点,分类讨论如下:1.y>0:  最大化a*x+b*y,维护一个上凸壳三分即可 2.y<0:最大化a*x+b*y  维护一个下凸壳三分即可 我们考虑对时间建出一棵线段 ...

  3. 【BZOJ】【3530】【SDOI2014】数数

    AC自动机/数位DP orz zyf 好题啊= =同时加深了我对AC自动机(这个应该可以叫Trie图了吧……出边补全!)和数位DP的理解……不过不能自己写出来还真是弱…… /************* ...

  4. BZOJ 3530: [Sdoi2014]数数 [AC自动机 数位DP]

    3530: [Sdoi2014]数数 题意:\(\le N\)的不含模式串的数字有多少个,\(n=|N| \le 1200\) 考虑数位DP 对于长度\(\le n\)的,普通套路DP\(g[i][j ...

  5. [BZOJ 3530] [Sdoi2014] 数数 【AC自动机+DP】

    题目链接:BZOJ - 3530 题目分析 明显是 AC自动机+DP,外加数位统计. WZY 神犇出的良心省选题,然而去年我太弱..比现在还要弱得多.. 其实现在做这道题,我自己也没想出完整解法.. ...

  6. bzoj 3530: [Sdoi2014]数数 数位dp

    题目 我们称一个正整数N是幸运数,当且仅当它的十进制表示中不包含数字串集合S中任意一个元素作为其子串.例如当S=(22,333,0233)时,233是幸运数,2333.20233.3223不是幸运数. ...

  7. 3530: [Sdoi2014]数数

    3530: [Sdoi2014]数数 链接 分析: 对给定的串建立AC自动机,然后数位dp.数位dp的过程中,记录当前在AC自动机的哪个点上,保证不能走到出现了给定串的点. 代码: #include& ...

  8. [BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛)

    [BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛) 题面 我们知道,从区间\([L,R]\)(L和R为整数)中选取N个整数,总共有\((R-L+1)^N\)种方案.求最大公约数 ...

  9. 【BZOJ 3326】[Scoi2013]数数

    题目描述 Fish 是一条生活在海里的鱼,有一天他很无聊,就开始数数玩.他数数玩的具体规则是: 确定数数的进制B 确定一个数数的区间[L, R] 对于[L, R] 间的每一个数,把该数视为一个字符串, ...

随机推荐

  1. Windows 7 封装与定制不完全教程

    Windows 7 封装与定制不完全教程 从定制Win7母盘到封装详细教程 手把手教你定制WIN7小母盘 Windows 7 封装与定制不完全教程 [教程] Windows 7 封装与定制不完全教程( ...

  2. Linux编程之驱动

    增加自己写的驱动程序:http://blog.chinaunix.net/uid-23065002-id-115739.html http://os.51cto.com/art/201108/2840 ...

  3. windows docker测试二 下载container

    安装dockertoolbox,提供了一个docker的界面工具 Kitematic 和字符终端: Docker Quickstart Terminal (这里安装的Kitematic 是Alpha版 ...

  4. OLE填充EXCEL 多SHEET

    "1 设置行高 "参数说明:行/列号.行高/列宽.R-行 C-列 FORM row_column USING p_r p_width p_type. CASE p_type. WH ...

  5. DIV设置overflow无效的原因

    因为项目需求需要在一个div中添加多个checked 添加的时候使用了 <label><input type="checkbox" value="123 ...

  6. NSComparisonResul、NSNotFound、NSEnumerationOptions......的用处

    NSNotFound 定义一个值,用于指示请求项找不到或不存在.Defines a value that indicates that an item requested couldn’t be fo ...

  7. java_easyui体系之DataGrid(4)[转]

    一:简介 在前面DataGrid(3)的基础上添加后台的实现.本来是想只搭建前台页面的.后台不写.现在觉得还是都实现好点.从真实情况出发.后台用的ssh. 1. 新增冻结列功能. 2. 实现界面的添加 ...

  8. sqlserver存储过程批量插入数据

    在系统中经常会遇到向数据库中批量插入数据情况,存储过程中没有数组,只有通过字符串分割循环插入,下面是一个本人研究的一个例子: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 c ...

  9. [vijos P1524] 最小监视代价

    历时四天(本周三至本周六),本人的第一道网络流题目终于通过了…虽然这么慢才搞懂很大程度是因为脑子笨,但是还是要吐槽一下: (1)选的这道题吧居然是无向图,对于初学者我表示呵呵,昨晚到现在一直在纠结怎么 ...

  10. android 自定义view -- 实现自定义 邮箱验证的Edittext

    //onFinishInflate 当View中所有的子控件均被映射成xml后触发 /** * 实现自定义 实现邮箱验证的EidtText */public class CustomEditText ...