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的更多相关文章

  1. ZOJ 3494 BCD Code(AC自动机+数位DP)

    BCD Code Time Limit: 5 Seconds      Memory Limit: 65536 KB Binary-coded decimal (BCD) is an encoding ...

  2. ZOJ 3494 BCD Code (AC自己主动机 + 数位DP)

    题目链接:BCD Code 解析:n个病毒串.问给定区间上有多少个转换成BCD码后不包括病毒串的数. 很奇妙的题目. . 经典的 AC自己主动机 + 数位DP 的题目. 首先使用AC自己主动机,得到b ...

  3. ZOJ 3494 BCD Code (数位DP,AC自动机)

    题意: 将一个整数表示成4个bit的bcd码就成了一个01串,如果该串中出现了部分病毒串,则是危险的.给出n个病毒串(n<=100,长度<21),问区间[L,R]中有几个数字是不含病毒串的 ...

  4. ZOJ 3494 BCD Code(AC自动机 + 数位DP)题解

    题意:每位十进制数都能转化为4位二进制数,比如9是1001,127是 000100100111,现在问你,在L到R(R <= $10^{200}$)范围内,有多少数字的二进制表达式不包含模式串. ...

  5. BCD Code ZOJ - 3494 AC自动机+数位DP

    题意: 问A到B之间的所有整数,转换成BCD Code后, 有多少个不包含属于给定病毒串集合的子串,A,B <=10^200,病毒串总长度<= 2000. BCD码这个在数字电路课上讲了, ...

  6. ZOJ 3494 (AC自动机+高精度数位DP)

    题目链接:  http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3494 题目大意:给定一些被禁止的BCD码.问指定范围内不含有 ...

  7. zoj3494 BCD Code(AC自动机+数位dp)

    Binary-coded decimal (BCD) is an encoding for decimal numbers in which each digit is represented by ...

  8. [ZOJ3494]BCD Code

    AC自动机+数位DP. 大致题意: BCD码就是把一个数十进制下的每一位分别用4位的二进制表示. 给你一坨01串,问你在一个区间内,有多少个数的BCD码不包含任何一个字符串. 因为涉及到多个串的匹配问 ...

  9. DP ZOJ 2745 01-K Code

    题目传送门 题意:要求任意连续子序列中0和1的数量差不超过k的方案数 分析:想好状态其实不难.dp[i][j][k]表示考虑前i长度,后缀中最大的 sum(0) - sum(1) = j, sum ( ...

随机推荐

  1. 【实验手册】使用Visual Studio Code 开发.NET Core应用程序

    .NET Core with Visual Studio Code 目录 概述... 2 先决条件... 2 练习1: 安装和配置.NET Core以及Visual Studio Code 扩展... ...

  2. 关于博客中引用多媒体出现的bug说明

    插件说明 Aplayer.Dplayer @DIYgod 大佬在gihub的开源项目,对此,表示非常之感谢!! Aplayer 支持放在页首 支持放在页尾 但是不支持直接放在文章中引用 解决方法: 1 ...

  3. postgresql 导出函数的方法

    先放一条mysql的导出语句 /usr/bin/mysqldump -h127.30.100.33 -P3388 -uname -ppassword --databases databasename ...

  4. Bmob 移动后端云服务器平台实现登录注册

    源码下载:http://download.csdn.net/download/jjhahage/10034519 PS:一般情况下,我们在写android程序的时候,想要实现登录注册功能,可以选择自己 ...

  5. Linq To EF

    l简单查询:var result = from c in Entities.Customer select c; l条件查询: 普通linq写法: var result = from c in Ent ...

  6. 基于Dubbo的http自动测试工具分享

    公司是采用微服务来做模块化的,各个模块之间采用dubbo通信.好处就不用提了,省略了之前模块间复杂的http访问.不过也遇到一些问题: PS: Github的代码示例还在整理中... 测试需要配合写消 ...

  7. MySQL视图,触发器,事务,存储过程,函数

    create triggr triafterinsertcmdlog after insert on cmd_log FOR EACH ROW trigger_body .#NEW : 代表新的记录 ...

  8. thinkinginjava学习笔记02_对象

    对象 1. 对象通过一个引用来操作,但是java中的对象是按值传递的,基本上可以在操作中认为对象本身,在内部结构中仍然要记得是对象实体的引用:如:String s = "abcd" ...

  9. springMVC(6)---处理模型数据

    springMVC(6)---处理模型数据 之前一篇博客,写个怎么获取前段数据:springMVC(2)---获取前段数据,这篇文章写怎么从后端往前端传入数据. 模型数据类型             ...

  10. 利用layer实现MVC页面数据互交提示弹框

    需求说明: 一个表单页面,点击提交之后,进入后台进行一系列数据交互,然后将交互信息返回至页面中,并以弹框形式展示 应用场景: 添加.修改.删除数据后,返回数据操作是否成功,以及一些其他信息 前期准备: ...