zoj 3494:BCD Code
Description
Binary-coded decimal (BCD) is an encoding for decimal numbers in which each digit is represented by its own binary sequence. To encode a decimal number using the common BCD encoding, each decimal digit is stored in a 4-bit nibble:
Decimal: 0 1 2 3 4 5 6 7 8 9
BCD: 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001
Thus, the BCD encoding for the number 127 would be:
0001 0010 0111
We are going to transfer all the integers from A to B, both inclusive, with BCD codes. But we find that some continuous bits, named forbidden code, may lead to errors. If the encoding of some integer contains these forbidden codes, the integer can not be transferred correctly. Now we need your help to calculate how many integers can be transferred correctly.
Input
There are multiple test cases. The first line of input is an integer T ≈ 100 indicating the number of test cases.
The first line of each test case contains one integer N, the number of forbidden codes ( 0 ≤ N ≤ 100). Then N lines follow, each of which contains a 0-1 string whose length is no more than 20. The next line contains two positive integers A and B. Neither A or B contains leading zeros and 0 < A ≤ B < 10200.
Output
For each test case, output the number of integers between A and B whose codes do not contain any of the N forbidden codes in their BCD codes. For the result may be very large, you just need to output it mod 1000000009.
Sample Input
3
1
00
1 10
1
00
1 100
1
1111
1 100
Sample Output
3
9
98 还是太怂了啊……终究还是只能照着CZL的标程写出来……gg啦
先预处理出AC自动机上某个节点在它后面加上[0...9]这些数字之后会到达哪一个节点或者不能添加该数字,然后就是普通数位dp了
#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; int read_p,read_ca;
inline int read(){
read_p=;read_ca=getchar();
while(read_ca<''||read_ca>'') read_ca=getchar();
while(read_ca>=''&&read_ca<='') read_p=read_p*+read_ca-,read_ca=getchar();
return read_p;
}
const int LO=,MOD=;
inline void M(int &ans){
if (ans>=MOD) ans-=MOD;
}
struct tree{
int f;
bool w;
int t[LO],v[LO];
}t[];
char s[],n,m,tt;
bool us[];
int map[][],f[][],ti[][];
int num=;
queue <int> q;
inline void in(){
int m=strlen(s),p=;
for (int i=;i<m;i++){
if (!t[p].t[s[i]-]) t[p].t[s[i]-]=++num;
p=t[p].t[s[i]-];
}
t[p].w=;
}
inline void mafa(){
q.push();int k,p;t[].f=;
while (!q.empty()){
k=q.front();q.pop();
for (int i=;i<LO;i++)
if (t[k].t[i]){
p=t[k].f;
while ((!t[p].t[i])&&p) p=t[p].f;
t[t[k].t[i]].f=(k==p)?:t[p].t[i];
q.push(t[k].t[i]);
}
}
}
inline void ro(){
int i,j,p;
for (i=;i<=num;i++)
for (j=;j<LO;j++)
if (t[i].t[j]) t[i].v[j]=t[i].t[j];else{
p=t[i].f;
while ((!t[p].t[j])&&p) p=t[p].f;
t[i].v[j]=t[p].t[j];
}
}
inline void dfs(int x){
if (us[x]) return;
us[x]=;
if (t[x].w) return;
dfs(t[x].f);
t[x].w|=t[t[x].f].w;
}
inline void ju(){
int i,j,k,p;
for (i=;i<=num;i++)
if (!t[i].w)
for (j=;j<;j++){
p=i;
for (k=;k>=;k--){
p=t[p].v[((<<k)&j)>];
if (t[p].w) break;
}
if (t[p].w) map[i][j]=-;else map[i][j]=p;
}
}
inline void FI(){
for (int i=;i<=num;i++) t[i].w=t[i].f=us[i]=;
for (int i=;i<=num;i++)
for (int j=;j<LO;j++)
t[i].t[j]=t[i].v[j]=;
num=;us[]=;
}
inline void add(){
int m=strlen(s),i;
for (i=m-;i>=;i--) if (s[i]!='') break;
if (i>=){
s[i]++;for (i++;i<m;i++) s[i]='';
}else{
s[]='';for (i=;i<=m;i++) s[i]='';s[m+]=;
}
}
inline int ss(int x,int y){
if (y==) return ;
if (ti[x][y]==tt) return f[x][y];
ti[x][y]=tt;
int ans=;
for (int i=;i<;i++) if (map[x][i]!=-)
M(ans+=ss(map[x][i],y-));
return f[x][y]=ans;
}
inline int an(){
int ans=;
int i,j,p,m=strlen(s);
for (i=;i<m;i++) s[i]-=;
for (i=;i<m;i++) for (j=;j<;j++) if (map[][j]!=-) M(ans+=ss(map[][j],i-));
for(i=;i<s[];i++)if(map[][i]!=-) M(ans+=ss(map[][i],m-));
p=map[][s[]];
for (i=;i<m&&p!=-;i++){
for (j=;j<s[i];j++) if (map[p][j]!=-) M(ans+=ss(map[p][j],m-i-));
p=map[p][s[i]];
}
return ans;
}
inline void work(){
int ans;
FI();
n=read();
for (int i=;i<=n;i++) scanf("%s",s),in();
mafa();for (int i=;i<=num;i++)dfs(i);ro();ju();
scanf("%s",s);ans=an();
scanf("%s",s);add();ans=an()-ans;
printf("%d\n",(ans<?ans+MOD:ans));
}
int main(){
for (tt=read();tt;tt--) work();
}
zoj 3494:BCD Code的更多相关文章
- ZOJ 3494 BCD Code(AC自动机+数位DP)
BCD Code Time Limit: 5 Seconds Memory Limit: 65536 KB Binary-coded decimal (BCD) is an encoding ...
- ZOJ 3494 BCD Code (AC自己主动机 + 数位DP)
题目链接:BCD Code 解析:n个病毒串.问给定区间上有多少个转换成BCD码后不包括病毒串的数. 很奇妙的题目. . 经典的 AC自己主动机 + 数位DP 的题目. 首先使用AC自己主动机,得到b ...
- ZOJ 3494 BCD Code (数位DP,AC自动机)
题意: 将一个整数表示成4个bit的bcd码就成了一个01串,如果该串中出现了部分病毒串,则是危险的.给出n个病毒串(n<=100,长度<21),问区间[L,R]中有几个数字是不含病毒串的 ...
- ZOJ 3494 BCD Code(AC自动机 + 数位DP)题解
题意:每位十进制数都能转化为4位二进制数,比如9是1001,127是 000100100111,现在问你,在L到R(R <= $10^{200}$)范围内,有多少数字的二进制表达式不包含模式串. ...
- BCD Code ZOJ - 3494 AC自动机+数位DP
题意: 问A到B之间的所有整数,转换成BCD Code后, 有多少个不包含属于给定病毒串集合的子串,A,B <=10^200,病毒串总长度<= 2000. BCD码这个在数字电路课上讲了, ...
- ZOJ 3494 (AC自动机+高精度数位DP)
题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3494 题目大意:给定一些被禁止的BCD码.问指定范围内不含有 ...
- zoj3494 BCD Code(AC自动机+数位dp)
Binary-coded decimal (BCD) is an encoding for decimal numbers in which each digit is represented by ...
- [ZOJ3494]BCD Code
AC自动机+数位DP. 大致题意: BCD码就是把一个数十进制下的每一位分别用4位的二进制表示. 给你一坨01串,问你在一个区间内,有多少个数的BCD码不包含任何一个字符串. 因为涉及到多个串的匹配问 ...
- DP ZOJ 2745 01-K Code
题目传送门 题意:要求任意连续子序列中0和1的数量差不超过k的方案数 分析:想好状态其实不难.dp[i][j][k]表示考虑前i长度,后缀中最大的 sum(0) - sum(1) = j, sum ( ...
随机推荐
- IntelliJ IDEA(六) :Settings(下)
一.Build,Execution,Deployment 项目的构建,执行,部署相关的配置. 1. Build Tools 构建工具,包含Maven,Gradle,Gant. Maven Work o ...
- 基于CDH 5.9.1 搭建 Hive on Spark 及相关配置和调优
Hive默认使用的计算框架是MapReduce,在我们使用Hive的时候通过写SQL语句,Hive会自动将SQL语句转化成MapReduce作业去执行,但是MapReduce的执行速度远差与Spark ...
- 查看windows、linux的SN
gwmi win32_bios [root@live-al-ops-pxe-2 ~]# dmidecode | grep Number | sed -n '1p' Serial Number: ...
- SSL/TLS通信
本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/31 复习基本概念 对称密码:加密和解密使用同一密匙. 公钥密码: ...
- Java 哲学家进餐
某次操作系统实验存档.V 这个哲学家除了吃就知道睡.( ╯□╰ ) 哲学家.java: package operating.entity.philosophyeating; import operat ...
- DEDECMS最新5.7版在Windows下的Memcache安装
一,织梦后台后台设置进入系统后台,在[系统基本参数]下面的"性能选项"卡当中,关于memcache进行如下配置: cfg_memcache_enable : 是否启用memcach ...
- Head First设计模式之解释器模式
一.定义 给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子. 主要解决:对于一些固定文法构建一个解释句子的解释器. 何时使用:如果一种特定类型的问题发生的频率足 ...
- 微信小程序开发之picker选择器组件用法
picker组件时一个从底部弹起的可滚动的选择器(嵌入页面滚动器组件picker-view查看https://mp.weixin.qq.com/debug/wxadoc/dev/component/p ...
- window64 PHP ffmpeg详解简单上手 音频amr转mp3
从网上找了一大堆关于window 64 ffmpeg的信息,都是又长又不关键,让人难消化. 我只要简单的amr转MP3格式而已. 终于搞明白.自己总结了下! 希望能帮助到喜欢言简意赅,一眼上手的同学. ...
- 最新版solr7.2集群搭建详细步骤
集群:高可用,备份,数据可分片 需要运行4个tomcat 1.tomcat端口号(默认占用8005,8009,8080三个端口) tomcat服务 占用端口 tomcat1 6005.6060.600 ...