阿拉~好像最近总是做到 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. 启动tomcat后struts框架报异常严重: Exception starting filter struts2 Unable to load configuration.

    启动tomcat后struts框架报异常严重: Exception starting filter struts2 Unable to load configuration. 出现此异常是因为,str ...

  2. myeclipse/eclipse没有Project Facets的解决方法

    http://www.cnblogs.com/jerome-rong/archive/2012/12/18/2822783.html 经常在eclipse中导入web项目时,出现转不了项目类型的问题, ...

  3. Android Hook Dexposed原理小析

    dexposed是阿里巴巴在xposed框架上面开发的hotpatch一套框架 当然hotpatch的方式有很多,这里先介绍下dexposed原理 Demo中有个test函数, 在调用hook之前正常 ...

  4. hdu ----3695 Computer Virus on Planet Pandora (ac自动机)

    Computer Virus on Planet Pandora Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 256000/1280 ...

  5. 初次使用InstallShield笔记

    公司的产品需要打包发布,以前一直没打包,打包方法的学习交给了我 下面的内容是我研究过后的,通过回忆写的笔记.由于不熟悉,可能会有错误或者是笨办法,希望高手指正,感激不尽. 有些东西是什么,以及是什么意 ...

  6. 第一章 企业项目开发--maven+springmvc+spring+mybatis+velocity整合

    说明:本系列文章主要是对自己在一家大型互联网公司实习的过程中对所学知识的总结!参与的是实际中使用的上线项目. 代码的github地址:https://github.com/zhaojigang/ssm ...

  7. css属性选择器

    1.E[att] 选择具有attr属性的E元素.2.E[att="val"] 选择具有att属性且属性值等于val的E元素3.E[att~="val"] 选择具 ...

  8. bzoj 2763: [JLOI2011]飞行路线

    #include<cstdio> #include<cstring> #include<iostream> #include<queue> #defin ...

  9. JVM-类加载机制

    虚拟机类加载机制  虚拟机把描述的类的数据从class文件加载到内存后,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制.  类加载的时机 类被 ...

  10. webshell

    webshell就是以asp.php.jsp或者cgi等网页文件形式存在的一种命令执行环境,也可以将其称做为一种网页后门.黑客在入侵了一个网站后,通常会将asp或php后门文件与网站服务器WEB目录下 ...